須要插入子集的時候如何更新父級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

相關文章
相關標籤/搜索