须要插入子集的时候如何更新父级ID

场景模拟:sql

咱们须要在不一样的新闻站点中采集新闻信息,  因此须要在数据库中保存一个新闻站点表(Site) 一个新闻表(News) 两表之间的关系是        Site(1)-News(N)数据库

数据库关系7048.tmp spa

实例:.net

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

 

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

解析:内存

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

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

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

相关文章
相关标签/搜索