删除实体框架中的对象及其所有相关实体

LPC*_*Roy 26 ado.net entity-framework

有没有人知道如何删除EF中的对象及其所有相关实体,而无需手动遍历对象图并删除每个对象?

例如,我有SalesOrder和SalesOrderDetails,它们之间的关系为1:N.当我删除SalesOrder时,我希望自动删除所有SalesOrderDetails.

这可能在EF吗?

ale*_*emb 26

您不应该在实体框架中执行此操作.所有流行的关系数据库都支持ON CASCADE DELETE外键,这也是非常有效的.我建议你顺其自然.

  • 叶氏.如果对数据库中的关系进行级联删除,并将其带入EF模型,则EF实际上会删除内存中的依赖实体,以尝试使内存对象图与数据库保持同步.但是,您不应该依赖EF删除作为数据库作业的相关所有相关对象. (7认同)
  • 不是CASCADE DELETE的忠实粉丝.删除操作中未提及的记录会让我感到害怕.这可能需要更多工作,但设置适当的引用约束并明确删除关联数据更安全.CASCADE DELETE可能很难追踪错误,如果你不记得你打开它(或者你正在使用的其他开发人员不知道它),可能会导致无意中的数据丢失. (6认同)
  • 谢谢亚历克斯,我担心CASCADE DELETE会破坏内存状态但是如果EF保持最新状态那么这就行了! (2认同)

Mar*_*oli 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 没有 检索所有依赖实体并为它们发出删除:它只删除已经在内存中的依赖项.