首页 > 技术文章 > 需要插入子集的时候如何更新父级ID

farcall 2015-10-01 21:26 原文

场景模拟:

我们需要在不同的新闻站点中采集新闻信息,  所以需要在数据库中保存一个新闻站点表(Site) 一个新闻表(News) 两表之间的关系是        Site(1)-News(N)

数据库关系7048.tmp

实例:

程序运行后我们首先会加载新闻站点列表和采集规则,比如准备开始采集”新浪-国内新闻”板块的时候,解析出的所有新闻都保存在数据库中,在新闻表 Site_Id的值是新浪保存在News中的主键。

 

关联问题可参阅http://bbs.csdn.net/topics/391036710?page=1

解析:

如果我们采用原生sql来写的话,可能就是读取出Site的主键(此时早已读取出来保存在内存中 ),然后结合准备添加的News实体构造insert语句即可,不过EF的使用原则应该是:

子集的添加应该是添加到父集中的导航属性(ICollection<T>)

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {

        public class Site
        {
            [Key]
            public int Id{ get; set; }
            public string Name { get; set; }


            /*virtual 知识点关键字:EF三种关联加载  Lazy Loading,Eager Loading,Explicit Loading*/
            public virtual ICollection<News> Newss { get; set; }
        }

        public class News
        {
            [Key]
            public int Id { get; set; }
            
            public string title { get; set; }
            public string content { get; set; }

            public virtual Site Site { get; set; }
        }
        public class MyTestContent : DbContext
        {
            public MyTestContent( )
            {
                Database.SetInitializer<MyTestContent>(null);
            }
            public DbSet<Site> Site { get; set; }
            public DbSet<News> News{ get; set; }
        }

        static void saveSiteDemo( )
        {
            using (var db = new MyTestContent())
            {
                db.Site.Add(new Site
                {
                    Name = "新浪"
                });

                db.SaveChanges();
            }
        }

        static void saveSiteDemo( string siteName )
        {
            //首先读取站点实体
            using (var db = new MyTestContent())
            {
                Site site = db.Site.FirstOrDefault(one => one.Name == siteName);

                /*图1:站点下还没有新闻的时候容器为null 所以我们需要new一个出来*/
                if (site.Newss == null)
                {
                    site.Newss = new List<News>();
                }

                /*将需要添加的子集  添加到父集的导航属性中*/
                site.Newss.Add(new News
                {
                    title = "新闻标题",
                    content = "新闻内容"
                });

                /*保存数据库 子集保存完成*/
                db.SaveChanges();

                /*图2:现在来读取子集看看有没有值*/
                News news = db.News.FirstOrDefault();
                /*图3:再来读取父集看看 读取出来的结果与图1有和不同*/
                Site newSite = db.Site.FirstOrDefault();
            }
        }


        static void Main( string[] args )
        {
            saveSiteDemo();
            saveSiteDemo("新浪");
        }

image

 

 image

 

image

推荐阅读