有没有人知道如何删除EF中的对象及其所有相关实体,而无需手动遍历对象图并删除每个对象?
例如,我有SalesOrder和SalesOrderDetails,它们之间的关系为1:N。当我删除SalesOrder时,我希望自动删除所有SalesOrderDetails。
这可能在EF吗?
答案 0 :(得分:26)
您不应该在实体框架中执行此操作。所有流行的关系数据库都支持外键上的ON CASCADE DELETE
,这也是非常有效的。我建议你顺其自然。
答案 1 :(得分:7)
在这篇文章中,Alex Jamese(发表他的回答),有一篇关于这个主题的完整文章。
http://blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx
EF负责SaveChanges()之后ObjectContext的正确性。因此,EF尝试将ObjectContext与数据库中预期的级联之后的预期数据库状态同步。 一个告诉我的问题是,如果你打开像SqlProfiler这样的东西,你会注意到当删除一个主体时,EF会发出它知道的依赖实体的DELETE请求(即在ObjectContext中加载的)。 /强> 基本上,这里发生的是实体框架期望删除数据库中的主体,将删除数据库中的所有依赖项。所以它应该发出什么,应该是多余的DELETE来请求自己,以便从ObjectContext中删除已经加载的依赖项。 需要注意的关键是EF 不检索所有依赖实体并为它们发出删除:它只删除已经在内存中的依赖项。