DDD将实体框架数据模型映射到域模型

时间:2016-10-25 08:34:48

标签: c# entity-framework entity-framework-6 domain-driven-design

我理解实体数据模型应该与真实域模型分开,以避免基础结构问题与域本身之间的耦合,但我想知道所有域属性是否都没有公共设置器,我们如何从数据模型映射到域模型,特别是如果存储库实现驻留在项目的基础结构部分,所以我们不能使用内部属性设置器。

class DomainModel
{
    string SomeProperty {get; private set:}
}

2 个答案:

答案 0 :(得分:2)

在您拥有中间数据模型"的模式中,实体框架不再能控制您的域实体的实例化方式。你的存储库有。因此,他们不一定需要公共制定者,您也可以使用构造函数对它们进行补充。

这里解释了一种这样的技术:https://vaughnvernon.co/?p=879

请注意,更简单的替代方法可以是避免使用其他数据模型并使用私有设置器(请参阅https://lostechies.com/jimmybogard/2014/04/29/domain-modeling-with-entity-framework-scorecard/),如果您认为EF对您的实体产生的影响很小,可以进行合理的权衡。

答案 1 :(得分:0)

  

我知道实体数据模型应该与真实域模型分开

不正确

  

避免基础设施问题与域名本身之间的耦合

CAN 使用EF直接保留您的域模型,但您不应将您的域模型与EF结合。

这是什么样的?

我们假设您有一个名为Domain的项目,其中包含您的模型,另一个名为DataStore的项目,其中包含您的存储库以保留所述模型(使用EF)

现在通常使用EF,您会在要保留的模型上使用属性和各种废话,但是这会污染&将这些模型与EF结合作为存储机制&从您的纯Domain项目中为EF添加依赖项 - 这是我们试图避免的。

EF6救援,看看EF6 FluentApi,您可以配置您的域模型以使用EF,而无需向Domain项目添加任何EF特定属性或依赖项。

主键?

modelBuilder.Entity<OfficeAssignment>().HasKey(t => t.InstructorID);

索引?

modelBuilder 
.Entity<Department>() 
.Property(t => t.Name) 
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute()));

如果你为每一个对象做这件事,现在这很快就会变得很痛苦,但如果你坚持一些约定(或者使用基类型来使这更容易)

然后,您可以使用反射为您域中的所有实体执行此操作auto-magically

祝你好运