Entity framework 级联删除注意事项
版本:EF6.0.1 RC
一对多场景,在子对象映射中开启级联删除情况下,删除父对象将自动删除其下所有子对象,需要注意一些事项:
需要保证DbContext中已经加载了该父对象的所有子对象。
如果DbContext内未加载子对象将不级联删除子对象(请看示例代码1),
如DbContext只加载部分子对象也只级联删除这些子对象(遗漏删除未加载的子对象),(请看示例代码2)。
因此在查询父对象只应该使用Include("子对象属性名")查询(请看示例代码3)或者在DbContext另外把其下所有子对象查询出来(请看示例代码4),再进行对父对象的删除方可级联删除子对象。
示例代码:
这里只列出关键实体和过程代码,省去DbContext相关配置代码
//父类 public class Tb2Entity
{
public int Id { get; set; }
public string Name { get; set; }
public virtual IList<Item2Entity> Items { get; set; }
}
//子类
public class Item2Entity
{
public int Id { get; set; }
public int? Pid { get; set; }
public string Title { get; set; }
public virtual Tb2Entity Parent { get; set; }
}
示例代码1(不正确)
只删除了父对象遗漏删除子对象了
var i = 15;
using (var db1 = new Db1Context("db conn string"))
{
var tb1 = new Tb2Entity
{
Id = i,
Name = "n1",
Items = new List<Item2Entity> {
new Item2Entity{Id=1, Title="t1"},
new Item2Entity{Id=2, Title="t2"},
new Item2Entity{Id=3, Title="t3"}
}
};
db1.Set<Tb2Entity>().Add(tb1);
db1.SaveChanges();
}
Console.ReadKey();
using (var db1 = new Db1Context(Conns.db1))
{
var tb1 = db1.Set<Tb2Entity>().Find(i);
db1.Set<Tb2Entity>().Remove(tb1);
db1.SaveChanges();
}
未例代码2(不正确)
只删除了父对象和部分子对象(遗漏删除id=3的子对象)
var i = 15;
using (var db1 = new Db1Context(Conns.db1))
{
var tb1 = new Tb2Entity
{
Id = i,
Name = "n1",
Items = new List<Item2Entity> {
new Item2Entity{Id=1, Title="t1"},
new Item2Entity{Id=2, Title="t2"},
new Item2Entity{Id=3, Title="t3"}
}
};
db1.Set<Tb2Entity>().Add(tb1);
db1.SaveChanges();
}
Console.ReadKey();
using (var db1 = new Db1Context(Conns.db1))
{
var tb1 = db1.Set<Tb2Entity>().Find(i);
var item1 = db1.Set<Item2Entity>().Find(1);
var item2 = db1.Set<Item2Entity>().Find(2);
db1.Set<Tb2Entity>().Remove(tb1);
db1.SaveChanges();
}
示例代码3(正确)
父对象连同子对象一起加载,级联删除时得以一起删除
var i = 15;
using (var db1 = new Db1Context(Conns.db1))
{
var tb1 = new Tb2Entity
{
Id = i,
Name = "n1",
Items = new List<Item2Entity> {
new Item2Entity{Id=1, Title="t1"},
new Item2Entity{Id=2, Title="t2"},
new Item2Entity{Id=3, Title="t3"}
}
};
db1.Set<Tb2Entity>().Add(tb1);
db1.SaveChanges();
}
Console.ReadKey();
using (var db1 = new Db1Context(Conns.db1))
{
var tb1 = db1.Set<Tb2Entity>()
.Include(m => m.Items) //同时加载所有子对象
.Where(m => m.Id == i).Take(1).SingleOrDefault();
db1.Set<Tb2Entity>().Remove(tb1);
db1.SaveChanges();
}
示例代码4(正确)
子对象通过延迟方式加载进来,级联删除时得以一起删除
var i = 15;
using (var db1 = new Db1Context(Conns.db1))
{
var tb1 = new Tb2Entity
{
Id = i,
Name = "n1",
Items = new List<Item2Entity> {
new Item2Entity{Id=1, Title="t1"},
new Item2Entity{Id=2, Title="t2"},
new Item2Entity{Id=3, Title="t3"}
}
};
db1.Set<Tb2Entity>().Add(tb1);
db1.SaveChanges();
}
Console.ReadKey();
using (var db1 = new Db1Context(Conns.db1))
{
var tb1 = db1.Set<Tb2Entity>().Find(i);
//延迟方式加载所有子对象
if (tb1.Items != null)
{
}
db1.Set<Tb2Entity>().Remove(tb1);
db1.SaveChanges();
}
Entity framework 级联删除注意事项的更多相关文章
- Entity Framework 级联删除
为一对主从表增加级联删除功能 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.E ...
- SQL Server 与 Entity Framework 级联删除
SQL Server 级联设置我就不多说了,网上很多教程. 我想提的是 cycles or multiple cascade paths 的问题. 简单的说如果你的级联设置不是一个树型,而是一个带有循 ...
- EF级联删除
引言 在主表中指定Key,子表中指定Required后,并不会在数据库中生成级联删除的外键.那怎么才能使EF在数据中生成级联删除的外键? SQLServer数据库中级联删除功能配置界面: 上图 ...
- 【转】Entity Framework教程
转自:http://www.cnblogs.com/xray2005/category/189491.html Entity Framework系列文章导航 摘要: 本节集合了Entity Fra ...
- Entity Framework 简单增删改操作
前言 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加.删除.修改操作. 增加 在EF中添加 ...
- MVC5 Entity Framework学习之实现主要的CRUD功能
在上一篇文章中,我们使用Entity Framework 和SQL Server LocalDB创建了一个MVC应用程序,并使用它来存储和显示数据.在这篇文章中,你将对由 MVC框架自己主动创建的CR ...
- Entity Framework Code First级联删除
如果我们要到一对主从表增加级联删除,则要在主表中的引用属性上增加Required关键字,如: public class Destination { public int DestinationId { ...
- Entity Framework Code First级联删除(转)
使用Data Annotations: 如果我们要到一对主从表增加级联删除,则要在主表中的引用属性上增加Required关键字,如: public class Destination { public ...
- Entity Framework Core系列之DbContext(删除)
上一篇我们介绍了Entity Framework Core系列之DbContext(修改),这一篇我们介绍下删除数据 修改实体的方法取决于context是否正在跟踪需要删除的实体. 下面的示例中con ...
随机推荐
- 实体类在Windows程序中的高级应用--------------------》》心境是一种境界。
一.事务 我们在大家学到这,或多或少对事务都有一些理解了.今天的我也对事务有了更深一层的理解对我来说,我想与大家一起分享一下. 解析: 1.ADO.NET提供了事务处理功能 2.C#中开启事务 3.在 ...
- Web Uploader - 功能齐全,完美兼容 IE 的上传组件
文件上传是网站和 Web 应用程序的常用功能,一直没有一款完美的文件上传组件,因此让很多开发人员碰到头疼的浏览器兼容问题. WebUploader 是由 Baidu FEX 团队开发的一款以 HTML ...
- Ajax中get和post使用问题
使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化: 解决方法:在?后面链接一个num=[随机数Math.rando ...
- 【iScroll源码学习01】准备阶段
前言 我们昨天初步了解了为什么会出现iScroll:[SPA]移动站点APP化研究之上中下页面的iScroll化(上),然后简单的写了一个demo来模拟iScroll,其中了解到了以下知识点: ① v ...
- 【初探Underscore】再说模版引擎
前言 Underscore 是一个JavaScript实用库,提供了类似Prototype.js (或 Ruby)的一些功能,但是没有扩展任何JavaScript内置对象. 它弥补了部分jQuery没 ...
- JS中取整以及随机颜色问题
前言:感觉自己已经好久好久没有写博客了,最近都是在写在线笔记比较多.现在来到新公司了,昨天刚刚完成一个项目所以今天有空研究研究一下前端方面的技术.下午在看一个游戏代码的时候,发现了几个别人留下的不错的 ...
- 如何对sharepoint图片库的文件夹的图片按照时间排序并分页显示
/// <summary> /// 获取图片库第一层文件夹--根据文件夹名称排序 /// </summary> /// <param name="siteUrl ...
- Snort - 配置文件
Snort.conf 版本 2.9.8.3 编译可用选项: --enable-gre --enable-mpls --enable-targetbased --enable-ppm --enable- ...
- ios开发人员北京,上海,深圳的工资待遇是多少?
ios开发人员北京,上海,深圳的工资待遇是多少? [1]首先看看平均工资 从图中来看,北京平均工资15570 居首,不愧是首都啊. 你过了平均线了吗?是不是感觉被平均了,如果感觉工资 ...
- JSON 转javabean 利器
别再对着json来手写javabean啦.这个工作完全不要脑子,而且耗时. 这里给大家提供三种方式: android studio版: 万能的插件:GsonFormat 如何安装? Preferenc ...