我正在尝试实现此处概述的多个 DDD 有界上下文。这是一个示例上下文:
我为每个实体都有一个实体类型配置文件,其中包含适当的 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 多个不同的上下文,这也可能成为维护的噩梦。
或者,我可以为每个上下文提供非常具体的实体模型,但这又会导致实体类爆炸和重复配置中的潜在维护问题。
在实施有界上下文时,如何最好地管理和维护实体及其实体配置?