我理解实体数据模型应该与真实域模型分开,以避免基础结构问题与域本身之间的耦合,但我想知道所有域属性是否都没有公共设置器,我们如何从数据模型映射到域模型,特别是如果存储库实现驻留在项目的基础结构部分,所以我们不能使用内部属性设置器。
class DomainModel
{
string SomeProperty {get; private set:}
}
答案 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
。