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

本文关键字:领域模型 数据模型 框架 映射 实体 DDD | 更新日期: 2023-09-27 18:14:59

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

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

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

在一个模式中,你有一个中间的"数据模型",实体框架不再控制你的领域实体是如何实例化的。您的存储库有。所以它们不一定需要公共setter,你也可以使用构造函数来补充它们。

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

请注意,如果您认为EF对实体的影响很小,那么一个更简单的替代方法是避免额外的数据模型并使用私有setter(参见https://lostechies.com/jimmybogard/2014/04/29/domain-modeling-with-entity-framework-scorecard/)。

我理解实体数据模型应该与实际领域模型分开

不正确

避免基础结构关注和域本身之间的耦合

真正


可以使用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在你的域内的所有实体。

好运