場景模擬:sql
咱們須要在不一樣的新聞站點中採集新聞信息, 因此須要在數據庫中保存一個新聞站點表(Site) 一個新聞表(News) 兩表之間的關係是 Site(1)-News(N)數據庫
實例:.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("新浪"); }