Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 删除实体框架中的对象及其所有相关实体_Entity Framework_Ado.net - Fatal编程技术网

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

Entity framework 删除实体框架中的对象及其所有相关实体,entity-framework,ado.net,Entity Framework,Ado.net,有人知道如何在不手动遍历对象图并删除每个对象的情况下删除EF中的对象及其所有相关实体吗 例如,我得到了SalesOrder和SalesOrderDetails,它们之间的关系为1:N。删除SalesOrder时,我希望自动删除所有SalesOrderDetails 这在EF中可能吗?您不应该在实体框架中这样做。所有流行的关系数据库都支持在外键上级联删除,这也是非常有效的。我建议你就这么做。在这篇文章中,Alex Jamese(他发布了他的答案)有一篇关于这个主题的完整文章 EF负责保存更改()

有人知道如何在不手动遍历对象图并删除每个对象的情况下删除EF中的对象及其所有相关实体吗

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


这在EF中可能吗?

您不应该在实体框架中这样做。所有流行的关系数据库都支持在外键上级联删除
,这也是非常有效的。我建议你就这么做。

在这篇文章中,Alex Jamese(他发布了他的答案)有一篇关于这个主题的完整文章

EF负责保存更改()后ObjectContext的正确性。因此,EF尝试将ObjectContext与数据库中预期级联之后的预期数据库状态同步。 这方面的一个明显迹象是,如果您打开类似SqlProfiler的东西,您将注意到EF在删除主体时会对其知道的依赖实体(即加载在ObjectContext中的实体)发出删除请求。 本质上,这里发生的是实体框架期望删除数据库中的主体,将删除数据库中它的所有依赖项。因此,它发出了一个冗余的DELETE来请求自身,以便从ObjectContext中删除已经加载的依赖项。 需要注意的关键点是,EF不会检索所有依赖实体并为它们发出删除命令:它只删除内存中已经存在的依赖项


是的。如果您对数据库中的关系进行了级联删除,并将其引入EF模型,EF实际上会删除内存中的依赖实体,以尝试保持内存中的对象图与数据库同步。但是你不应该依赖EF删除所有相关的对象,这是数据库的工作。谢谢Alex,我担心级联删除会扰乱内存状态,但是如果EF保持它最新,那么这就行了!这是一个非常好的解决方案,因为您不必担心其他相关实体。只需在DB上设置cascade delete,一切都会变得干净简单。不太喜欢cascade delete。当删除操作中没有提到记录时,删除记录让我感到害怕。这可能需要更多的工作,但设置适当的引用约束并显式删除关联数据更安全。级联删除会使跟踪bug变得困难,如果您不记得自己已经打开了它(或者与您一起工作的其他开发人员不知道它),可能会导致意外的数据丢失。我认为EF as ORM应该使用SQL过程或触发器来删除所有关系。通过删除关系,我的意思是查找指向必须删除的记录的所有记录,并将保存id(指向记录)的字段设置为null(如果设置为允许null,因为它与关系1或0到多发生)