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

4

1 回答 1

2

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

于 2011-12-18T12:30:36.900 回答