版本: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 级联删除注意事项的更多相关文章

  1. Entity Framework 级联删除

    为一对主从表增加级联删除功能 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.E ...

  2. SQL Server 与 Entity Framework 级联删除

    SQL Server 级联设置我就不多说了,网上很多教程. 我想提的是 cycles or multiple cascade paths 的问题. 简单的说如果你的级联设置不是一个树型,而是一个带有循 ...

  3. EF级联删除

    引言     在主表中指定Key,子表中指定Required后,并不会在数据库中生成级联删除的外键.那怎么才能使EF在数据中生成级联删除的外键? SQLServer数据库中级联删除功能配置界面: 上图 ...

  4. 【转】Entity Framework教程

    转自:http://www.cnblogs.com/xray2005/category/189491.html   Entity Framework系列文章导航 摘要: 本节集合了Entity Fra ...

  5. Entity Framework 简单增删改操作

    前言 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加.删除.修改操作. 增加 在EF中添加 ...

  6. MVC5 Entity Framework学习之实现主要的CRUD功能

    在上一篇文章中,我们使用Entity Framework 和SQL Server LocalDB创建了一个MVC应用程序,并使用它来存储和显示数据.在这篇文章中,你将对由 MVC框架自己主动创建的CR ...

  7. Entity Framework Code First级联删除

    如果我们要到一对主从表增加级联删除,则要在主表中的引用属性上增加Required关键字,如: public class Destination { public int DestinationId { ...

  8. Entity Framework Code First级联删除(转)

    使用Data Annotations: 如果我们要到一对主从表增加级联删除,则要在主表中的引用属性上增加Required关键字,如: public class Destination { public ...

  9. Entity Framework Core系列之DbContext(删除)

    上一篇我们介绍了Entity Framework Core系列之DbContext(修改),这一篇我们介绍下删除数据 修改实体的方法取决于context是否正在跟踪需要删除的实体. 下面的示例中con ...

随机推荐

  1. <记录学习>(前三天)京东页面各种注意点

    培训学校第1到3天先学习HTML现在流行的是HTML5,目前学习的是HTML5规范.(给有基础一定的人学习)前三天学习的是京东页面的编写,和以前写的不同,页面看上去和自己写的一样,但老师讲的还是有很多 ...

  2. vsftp "上传 553 Could not create file"

    我在LINUX下VSftp建立一个FTP服务器,但从WINDOWS使用FTP时,无法上传也无法下载!出错如下 ftp>; ls 200 PORT command successful. Cons ...

  3. SharePoint 2013 VSS 编写器

    Windows Server 包含的 VSS 是提供内置卷影复制功能的基础结构.VSS 创建的卷影副本扩展了存储管理员的磁带备份存档解决方案,提供可轻松.有效创建和还原的高保真时间点副本,从而帮助简化 ...

  4. MyEclispe 2015 CI 15发布(附下载)

    MyEclipse 2015 CI 15带来了一些程序上的改进,包括可外部部署的JavaScript调 试,改进了 REST Inspect 和 WebSphere 框架支持,新增服务器连接器,另外还 ...

  5. 【Openlayers3】在地图上添加highcharts图表

    今天试用了一下ol3,效果很是不错! ol3中有个ol.Overlay,使用这个类我们可以在地图中添加各种html要素. 下面我们在地图中添加一个饼图 html中添加一个div容器: <div ...

  6. 【转】HttpClient使用Post和Get提交参数

    package httpclient; import java.io.IOException; import java.net.URLEncoder; import org.apache.common ...

  7. 【转】Android NFC学习笔记

    一:NFC的tag分发系统 如果想让android设备感应到NFC标签,你要保证两点 1:屏幕没有锁住 2:NFC功能已经在设置中打开 当系统检测到一个NFC标签的时候,他会自动去寻找最合适的acti ...

  8. UI复习

    UIButton的状态 • normal(普通状态) ➢ 默认情况 ➢ 对应的枚举常量:UIControlStateNormal • highlighted(高亮状态) ➢ 按钮被按下去的时候(手指还 ...

  9. Web应用程序系统的多用户权限控制设计及实现-总结【11】

    Web应用程序系统的多用户权限控制设计及实现通过10章内容讲述已经结尾了.写这些博客的目的很简单,方便自己以后参考,也留下自己编程岁月的一些痕迹.对于编程,对于工作,真是心甘情愿的就好. 由于这只是一 ...

  10. 【开源项目SugarSite】ASP.NET MVC+ Layui+ SqlSugar+RestSharp项目讲解

    SugarSite一个前端支持移动端的企业网站,目前只支持了简单功能,后续还会加上论坛等. 源码GIT地址: https://github.com/sunkaixuan/SugarSite 技术介绍 ...