C# DDD将实体框架数据模型映射到域模型
我理解实体数据模型应该与实际域模型分离,以避免基础设施关注点和域本身之间的耦合,但我想知道如果所有域属性都没有公共设置器,我们如何从数据模型映射到域模型,尤其是当存储库实现驻留在项目的基础结构部分时,所以我们不能使用内部属性设置器C# DDD将实体框架数据模型映射到域模型,c#,entity-framework,entity-framework-6,domain-driven-design,C#,Entity Framework,Entity Framework 6,Domain Driven Design,我理解实体数据模型应该与实际域模型分离,以避免基础设施关注点和域本身之间的耦合,但我想知道如果所有域属性都没有公共设置器,我们如何从数据模型映射到域模型,尤其是当存储库实现驻留在项目的基础结构部分时,所以我们不能使用内部属性设置器 class DomainModel { string SomeProperty {get; private set:} } 在具有中间“数据模型”的模式中,实体框架不再控制域实体的实例化方式。您的存储库已关闭。因此,它们不一定需要公共setter,您还可以使
class DomainModel
{
string SomeProperty {get; private set:}
}
在具有中间“数据模型”的模式中,实体框架不再控制域实体的实例化方式。您的存储库已关闭。因此,它们不一定需要公共setter,您还可以使用构造函数将它们重新水化 这里解释了一种这样的技术:
注意,一个更简单的选择可以避免额外的数据模型并使用私有的SET(参见),如果你认为EF对你的实体有一个合理的折衷影响。 我理解实体数据模型应该与实际域模型分开
不正确 避免基础设施问题和领域本身之间的耦合 真的您可以使用EF直接持久化域模型,但不应将域模型与EF耦合 这是什么样子的 假设您有一个名为
Domain
的项目,其中包含您的模型,还有一个名为DataStore
的项目,其中包含用于持久化所述模型的存储库(使用EF)
现在通常使用EF,您会在想要持久化的模型上使用属性和各种各样的废话,但这会污染并将这些模型耦合到EF作为一种存储机制,并从纯域
项目中添加对EF的依赖性-这是我们试图避免的
EF6为了解救您,请查看,您可以配置域模型以使用EF,而无需向域
项目添加任何特定于EF的属性或依赖项
主键
modelBuilder.Entity<OfficeAssignment>().HasKey(t => t.InstructorID);
modelBuilder.Entity().HasKey(t=>t.InstructorID);
索引
modelBuilder
.Entity<Department>()
.Property(t => t.Name)
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute()));
modelBuilder
.实体()
.Property(t=>t.Name)
.HasColumnAnnotation(“索引”,新索引注释(新索引属性());
现在,如果您对每个对象都这样做,那么这将很快成为一个难题,但是如果您坚持一些约定(或者使用基本类型使这更容易实现)
然后,您可以使用反射为域中的所有实体自动执行此操作
祝你好运通过构造函数传递参数。但EF已经是存储库模式和工作单元,为什么还需要基于它的另一个抽象呢?此外,如果您首先使用代码,则不需要数据模型;只需将数据库映射到域模型。@L-Four如果两个不同的域模型共享同一个基础结构表,或者您需要复杂属性中的复杂属性,该怎么办?然后使用“实体拆分”之类的技术。不确定复杂属性中的复杂属性是什么意思。@L-Four员工可以有位置,它可以是带有地址名、街道号、邮政编码和地理信息的复杂类型,而地理信息可以是另一个复杂类型,这意味着您需要有嵌套的复杂属性。我认为实体框架不支持这一点,这意味着您的域模型将受到基础设施问题的限制。当然,它通过导航属性支持这一点。我有点晚了,但当您不希望导航属性污染您的域模型时,如何解决fluent api中的外键?