Sql server 多多关系中的多级联删除路径(EF 4.1)
表格:Sql server 多多关系中的多级联删除路径(EF 4.1),sql-server,entity-framework,poco,ef-code-first,entity-framework-4.1,Sql Server,Entity Framework,Poco,Ef Code First,Entity Framework 4.1,表格: Shop Product Category (Shop) 1 <---> n (Categories) (Shop) 1 <---> n (Products) (Categories) n <---> n (Products) Shop ---> Categories ... I defined this using fluent API Shop ---> Products ..
Shop
Product
Category
(Shop) 1 <---> n (Categories)
(Shop) 1 <---> n (Products)
(Categories) n <---> n (Products)
Shop ---> Categories ... I defined this using fluent API
Shop ---> Products ... I defined this using fluent API
Categories <---> Products ... EF 4.1 automatically defines cascade for "Category_Product" join table
关系:
Shop
Product
Category
(Shop) 1 <---> n (Categories)
(Shop) 1 <---> n (Products)
(Categories) n <---> n (Products)
Shop ---> Categories ... I defined this using fluent API
Shop ---> Products ... I defined this using fluent API
Categories <---> Products ... EF 4.1 automatically defines cascade for "Category_Product" join table
(商店)1 n(类别)
(车间)1 n(产品)
(类别)n(产品)
级联删除:
Shop
Product
Category
(Shop) 1 <---> n (Categories)
(Shop) 1 <---> n (Products)
(Categories) n <---> n (Products)
Shop ---> Categories ... I defined this using fluent API
Shop ---> Products ... I defined this using fluent API
Categories <---> Products ... EF 4.1 automatically defines cascade for "Category_Product" join table
商店-->类别。。。我使用fluentapi定义了它
商店-->产品。。。我使用fluentapi定义了它
类别产品。。。EF 4.1自动定义“类别产品”联接表的级联
问题:
以上结果导致“多”级联删除路径异常
潜在修复:
Shop
Product
Category
(Shop) 1 <---> n (Categories)
(Shop) 1 <---> n (Products)
(Categories) n <---> n (Products)
Shop ---> Categories ... I defined this using fluent API
Shop ---> Products ... I defined this using fluent API
Categories <---> Products ... EF 4.1 automatically defines cascade for "Category_Product" join table
谢谢这不是实体框架的问题,而是SQL server的问题。我不认为那个异常实际上意味着循环级联删除。它更可能意味着多个级联删除路径,因为从商店级联可以同时从类别和产品端删除联接表记录。SQLServer不允许这样做,因为它需要一些更复杂(而且速度较慢)的算法来正确计算级联时哪些记录以及何时必须删除 简单地说,你必须打破这一点,这将真正意味着你将不得不手动删除所有相关记录(无论是类别或产品)之前,你删除商店。这需要存储过程(或直接SQL DELETE命令),否则必须先加载所有存储过程,然后逐个删除它们 编辑:
正如您在评论中指出的,这也可以通过在删除触发器之前添加触发器来解决。如果作为一个级联路径的替换存在,该触发器将删除相关记录。是的,我的意思是“多个路径”,我的错误。我知道SQL Server的限制,但这毫无意义,因为当您删除类别时,它将删除联接表中的类别产品记录,而不是实际的产品记录!但是SqlServer仍然将其包含在级联路径中。。。奇怪吧?所以触发器或存储过程是唯一的方法???我假设一个触发器检查商店何时被删除,所有相关记录也被删除,但是ORM的意义是什么?:-)但是,如果您删除shop,它将同时删除产品和类别,一旦其中任何一个被删除,它也将从join table中删除记录=删除可以来自任何一方。EF cascade deletes与数据库cascade deletes的关系非常密切,因此它与ORM无关,而与ORM的实现有关。这是我不理解的。假设我删除了Shop,它删除了类别。我不直接删除产品,而是让多对多级联删除来完成。那就行了。但是,n:n级联删除将从联接表中删除所有联接记录,但不会从Products表中删除实际记录。因此,我将没有店铺,没有类别,空的类别产品表,但仍然会有所有的产品记录。我误解了吗?