EF 级联删除

Posted alex-mercer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF 级联删除相关的知识,希望对你有一定的参考价值。

参考地址:

EF配置级联删除代码如下

 modelBuilder.Entity<Doc>().HasMany(a => a.Lines).WithRequired(a => a.Doc).HasForeignKey(a => a.DocNo);   //单头
 modelBuilder.Entity<Line>().HasRequired(a => a.Doc).WithMany().HasForeignKey(a => a.DocNo).WillCascadeOnDelete(true);  //表体 

有的小伙伴实验发现,明明我配置好了,为什么删除的时候没有把级联的一起删除呢。

  • 一对多场景,在子对象映射中开启级联删除情况下,删除父对象将自动删除其下所有子对象,需要注意一些事项:
  • √ 需要保证DbContext中已经加载了该父对象的所有子对象。
  • X 如果DbContext内未加载子对象将不级联删除子对象,
  • X 如DbContext只加载部分子对象也只级联删除这些子对象。
  • 因此在查询父对象只应该使用Include("子对象属性名")查询(请看示例代码3)或者在DbContext另外把其下所有子对象查询出来(请看示例代码4),再进行对父对象的删除方可级联删除子对象。
  • 但注意以上所述情况只适用于关联子项比较少的情况,数据量少的演示测试Demo可以,工作中应该杜绝该类解决方案的出现。

也就是说要用Include加载 出级联对象。这是参考地址中的治标方法,治本方法暂时看不懂

 using (var db = new Data())
            {
                var temp = db.Doc.Include("Lines").FirstOrDefault(a => a.DocNo.Equals(DocNo));
                db.Doc.Remove(temp);
                db.SaveChanges();
            }

以上是关于EF 级联删除的主要内容,如果未能解决你的问题,请参考以下文章

EF Code首先级联删除外键一对多

15.翻译系列:EF 6中的级联删除EF 6 Code-First 系列

使用 EF Core 进行级联删除

代码优先 TPT 和级联删除

使用共享主键关联时,EF 4.1 Code First 中的级联删除规则

.Net开源数据库设计工具Mr.E For Linq (EF 6.1) 教程级联删除和触发器