场景模拟:
我们需要在不同的新闻站点中采集新闻信息, 所以需要在数据库中保存一个新闻站点表(Site) 一个新闻表(News) 两表之间的关系是 Site(1)-News(N)
实例:
程序运行后我们首先会加载新闻站点列表和采集规则,比如准备开始采集”新浪-国内新闻”板块的时候,解析出的所有新闻都保存在数据库中,在新闻表 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("新浪"); }