Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DDD将实体框架数据模型映射到域模型_C#_Entity Framework_Entity Framework 6_Domain Driven Design - Fatal编程技术网

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中的外键?