多关系中的多级联删除路径(EF 4.1)

时间:2011-05-19 22:22:50

标签: 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)

CASCADE DELETES:

      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. 删除ManyToManyConvention,但这意味着我必须为系统中的每个连接表手动执行删除操作,这是不切实际的。
  2. 我可以从Shop-&gt; Category或Shop-&gt; Products中删除级联删除。但那时我可能会有很多孤立的记录。
  3. 你们是怎么处理这个问题的?

    感谢

1 个答案:

答案 0 :(得分:5)

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

您必须打破这一点,这实际上意味着您必须在删除商店之前手动删除所有相关记录(类别或产品)。这将需要存储过程(或直接SQL DELETE命令),否则您将必须首先加载所有这些并逐个删除它们。

编辑:

正如您在评论中指出的那样,这也可以通过添加BEFORE DELETE触发器来解决,如果存在替换一个级联路径,则会删除相关记录。