在Entity Framework中删除一个对象及其所有相关实体

26

有没有人知道如何在EF中删除一个对象及其所有相关实体,而不必手动遍历对象图并逐个删除?

例如,我有一个SalesOrder和SalesOrderDetails之间有1:N关系的模型。当我删除一个SalesOrder时,我希望所有的SalesOrderDetails都能自动删除。

这在EF中是否可行?

2个回答

26

你不应该在Entity Framework中这样做。所有流行的关系型数据库都支持外键的ON CASCADE DELETE,这种方法更加高效。我建议你使用它。


7
如果你在数据库中的关系中启用了级联删除,然后将其导入到 EF 模型中,EF 实际上会删除内存中的相关实体,以尝试使内存中的对象图与数据库保持同步。但你不应该依赖于 EF 删除所有相关对象,这是数据库的工作。 - Alex James
2
谢谢Alex,我担心级联删除会破坏内存状态,但如果EF保持它的最新状态,那么这个方法可行! - LPCRoy
这是一个非常好的解决方案,因为您不必担心其他相关实体。只需在数据库上设置级联删除 - 一切都会变得干净简单。 - torpederos
7
不是很喜欢级联删除。在不被删除操作提及的情况下删除记录让我感到担忧。虽然设置适当的引用约束并显式删除相关数据可能需要更多的工作,但更加安全。如果你忘记开启级联删除(或与之合作的另一个开发人员不知道它),级联删除可能会使跟踪错误变得困难,并可能导致意外的数据丢失。 - Justin
我认为EF作为ORM应该使用SQL存储过程或触发器来删除所有关系。通过删除关系,我的意思是找到所有指向要删除的记录的记录,并将保存id(指向该记录)的字段设置为null(如果它被设置为ALLOW NULL,就像在关系ONE OR ZERO TO MANY中发生的那样)。 - Bronek
引入FOREIGN KEY约束可能会导致循环或多个级联路径。请指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。因此,实际上这个答案并不是百分之百可靠的。 - John

7

在这篇文章中,Alex Jamese(发布了他的答案)对这个主题进行了完整的阐述。

链接

在SaveChanges()之后,EF负责ObjectContext的正确性。因此,EF试图将ObjectContext与预期的数据库状态同步,以及数据库中预期的级联。 这是一个明显的迹象,如果你打开像SqlProfiler这样的东西,你会注意到EF正在为它知道的依赖实体(即已经加载在ObjectContext中的实体)发出DELETE请求,当一个主体被删除时。 本质上,这里发生的事情是,实体框架期望在数据库中删除主体时,将删除数据库中的所有从属。因此,它发出了一个应该是多余的DELETE请求,以便从ObjectContext中删除已经加载的从属。 需要注意的关键一点是,EF 不会检索所有相关实体并为它们发出删除指令:它只删除已经在内存中的从属。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接