需要插入子集的时候如何更新父级ID
2024-10-18 19:27:14
场景模拟:
我们需要在不同的新闻站点中采集新闻信息, 所以需要在数据库中保存一个新闻站点表(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("新浪");
}
最新文章
- 推荐一款Mac上好用的Markdown编辑器
- ios初级必看视频
- 字符串匹配算法之SimHash算法
- iOS 利用长按手势移动 Table View Cells
- 结队开发项目——基于Android的无线点餐系统——NABC模型
- QMessageBox 弹出框上的按钮设置为中文
- Android 全屏显示-隐藏Navigation Bar
- SpringBoot接口服务处理Whitelabel Error Page(转)
- alert()显示中文出现乱码
- 团队作业8----第二次项目冲刺(Beta阶段) 第二天
- Android四大组件(详细总结)
- JavaUtil_04_验证码生成器
- df 命令详解
- CCS的文本及字体
- zabbix分布式监控部署--技术流ken
- 第11章 AOF持久化
- js中获取时间new date()的用法和获取时间戳
- Freemarker导出word的简单使用
- [Python] 02 - String
- Docker用途 &; 和tomcat的区别