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
  • 删除ManyToManyConvention,但这意味着我必须手动删除系统中的每个联接表,这是不切实际的
  • 我可以从Shop->Category或Shop->Products中删除级联删除。但我可能会有很多孤儿唱片
  • 你们是怎么处理这个问题的


    谢谢

    这不是实体框架的问题,而是SQL server的问题。我不认为那个异常实际上意味着循环级联删除。它更可能意味着多个级联删除路径,因为从商店级联可以同时从类别和产品端删除联接表记录。SQLServer不允许这样做,因为它需要一些更复杂(而且速度较慢)的算法来正确计算级联时哪些记录以及何时必须删除

    简单地说,你必须打破这一点,这将真正意味着你将不得不手动删除所有相关记录(无论是类别或产品)之前,你删除商店。这需要存储过程(或直接SQL DELETE命令),否则必须先加载所有存储过程,然后逐个删除它们

    编辑:


    正如您在评论中指出的,这也可以通过在删除触发器之前添加触发器来解决。如果作为一个级联路径的替换存在,该触发器将删除相关记录。

    是的,我的意思是“多个路径”,我的错误。我知道SQL Server的限制,但这毫无意义,因为当您删除类别时,它将删除联接表中的类别产品记录,而不是实际的产品记录!但是SqlServer仍然将其包含在级联路径中。。。奇怪吧?所以触发器或存储过程是唯一的方法???我假设一个触发器检查商店何时被删除,所有相关记录也被删除,但是ORM的意义是什么?:-)但是,如果您删除shop,它将同时删除产品和类别,一旦其中任何一个被删除,它也将从join table中删除记录=删除可以来自任何一方。EF cascade deletes与数据库cascade deletes的关系非常密切,因此它与ORM无关,而与ORM的实现有关。这是我不理解的。假设我删除了Shop,它删除了类别。我不直接删除产品,而是让多对多级联删除来完成。那就行了。但是,n:n级联删除将从联接表中删除所有联接记录,但不会从Products表中删除实际记录。因此,我将没有店铺,没有类别,空的类别产品表,但仍然会有所有的产品记录。我误解了吗?