【发布时间】:2013-09-02 10:25:10
【问题描述】:
我正在尝试实现多个 DDD 有界上下文,如 here 所述。这是一个示例上下文:
我为每个实体都有一个实体类型配置文件,其中包含适当的 FluentAPI 映射(使用 EF 工具进行逆向工程)。这些配置文件还包括关系配置。
例如:UserMap.cs
// Relationships
this.HasOptional(t => t.SecurityProfile)
.WithMany(t => t.Users)
.HasForeignKey(t => t.SecurityProfileCode);
SecurityProfile 和 DomainPermission 在上下文中不是 DbSets。由于 User 和 Module 上的导航属性,它们会自动带入模型中。
这导致了我的第一个问题。在将User(或任何其他实体)添加到任何其他上下文时,我必须记住做以下两件事之一:
还将
SecurityProfile(以及实体上的所有其他关系)的配置添加到模型构建器中以某种方式从模型中明确排除
SecurityProfile。
这开始成为一场维护噩梦。
我会很满意明确地“修剪”上面第 2 点所述的实体图。
但是,当实体配置文件中已经定义了关系时,Ignore() 实体似乎是不可能的。
尝试modelBuilder.Ignore<SecurityProfile>(); 用于上述上下文OnModelCreating 在ConfigureAssociations() 中会出现以下错误:
System.InvalidOperationException:导航属性“SecurityProfile”不是“用户”类型的声明属性。验证它没有被明确地从模型中排除,并且它是一个有效的导航属性。
我能想到的唯一解决方案是继承基本配置类并覆盖每个上下文中的关系配置。考虑到我们最终可能会得到 30-40 多个不同的上下文,这也可能成为维护的噩梦。
或者,我可以为每个上下文设置非常具体的实体模型,但这又会导致实体类爆炸和重复配置中的潜在维护问题。
在实施有界上下文时,如何最好地管理和维护实体及其实体配置?
【问题讨论】:
-
考虑到EF Project Site 声明“关于在您的应用程序中使用实体框架的问题,请使用实体框架标签在 Stack Overflow 上发布问题。”
-
如果您查看近距离投票,您会发现它“太宽泛”。我同意这一点。你有三个问题,一个都没有。附注:DDD 说您的实体应该是持久性无知的,而您的实体则不是,因为您显然必须更改它们以使其符合 EF 的要求。
-
@jgauffin 我很乐意将 3 个问题浓缩为第 3 个问题。然而,这不是一个简单的“我该怎么做”问题,背景信息对所有 3 个问题都有帮助。因此,考虑到 SO 是提出此类问题的推荐途径,因此它“太宽泛”的原因是无效的。也许这是开源项目劫持 SO 作为其社区渠道的问题。但似乎没有任何其他选择,这是我希望得到回应的唯一途径。
-
@BrettPostin 我不认为这是 EF 特有的问题。您的有界上下文不应泄漏到其他有界上下文中,否则它不再是有界的。真正的聚合设计只存储聚合之外元素的键。对于有界上下文也是如此。我不知道你是否已经读过 Vaughn Vernons 的书 (amazon.com/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/…),但它对我理解有界上下文有很大帮助
标签: c# entity-framework domain-driven-design