使用简单模型删除错误的代码优先级和级联

时间:2011-12-17 19:02:47

标签: entity-framework cascade cascading-deletes entity-framework-4.2

我有一个简单的模型来跟踪储物柜租赁,作为学习EF Code First和DDD原则的一种方式。该模型具有以下要求:

  • 可能有许多组织(即学校,学院等)。
  • 每个组织可以拥有许多储物柜和许多租期。
  • 对于每个独特的储物柜和租赁期对,可能会有几个租赁(即每个储物柜可以在一个学期内租给几个不同的人)。

模型设置如下:

组织拥有两个集合;一个用于存放一系列储物柜,另一个用于存放一系列租赁期。储物柜和租赁期间并未提及其母公司与DDD传统保持一致,但它们都包含其母公司所需的外键。储物柜和租赁期均包含一系列租金。租赁物具有储物柜所需的外键和租赁期间所需的外键。下面的图片将很好地了解我的模型的样子。

由于该组织使用级联删除建模,因此当组织被删除时,它会删除所有关联的储物柜和租赁期。但我相信,对于使用级联删除建模的储物柜和租赁期也是有意义的,这样如果一个储物柜被删除,那么所有相关的租赁也会被删除。同样的事情适用于租赁期。当我配置它时,EF告诉我我不能这样做,因为它可以创建循环或多个级联路径。但是,如果我采取任何一个关系(无关紧要哪一个)并关闭级联删除,那么它将创建数据库就好了。我想这可以修复多个级联路径问题。

因为删除级联在这个模型中不起作用,这似乎表明我的问题可能被建模错误。我已经考虑了很长一段时间了,我无法想出任何方法来模拟这个可以用于级联删除的问题。

我已经在下面包含了测试项目(Visual Studio 2010解决方案)。唯一需要更改的是App.config中的连接字符串。我对所有建议持开放态度,因为我刚刚开始学习EF Code First和DDD原则。

http://i.stack.imgur.com/MBjKU.png

http://www.mediafire.com/?kj3rrg433bq8i5g

1 个答案:

答案 0 :(得分:2)

它实际上没有以错误的方式建模,但只是SQL Server(不是EF)不允许多个级联路径。如果您的Organization被删除,则会触发LockersRentalPeriods的级联删除,并触发级联删除Rentals =问题。如果只有其中一个触发级联删除到Rentals,你应该没问题。您必须确保不会单独删除LockersRentalPeriods。如果是,您必须正确地手动删除Rentals,或者必须使用数据库触发器(避免此问题的常用方法)。