entity-framework-4 – 实体框架4和ddd中的EAV

我的数据库中的一些表是使用EAV概念设计的.
然后我使用自动生成的实体,并将ORM实体框架的“静态”表(不是“EAV”表)表示为DDD对象.

>如何使用Entity Framework在对象模型中使用我的“EAV”实体(不像在数据库中那样关联)?

例如,
在数据库中我有静态表Report和EAV表,它们帮助我存储ReportProperty for Report.
在域模型中我想要像这样的报告:

Report
{
     ICollection<ReportProperty> ReportProperties{get;set;}
}

我可以使用由Entity Framework生成的Report实体和部分部分
在getter中实现一些逻辑,用于从我的EAV表中检索数据以填充Collection ReportProperies.然后它回答下一个问题.

>如果我决定使用NHibernate而不是Entity Framework,我该怎么办,因为我不能使用我已经实现使用Entity Framework的部分部分?

如果我将使用DDD对象,我可以用于Entity Framework或NHibernate,对我来说很难,因为我需要在我的DAO中的每个过程中调用映射程序.

解决方法

EAV是数据访问层的概念,而DDD是业务逻辑层的概念.像Entity Framework或NHibernate这样的ORM诱惑我们将这两个层混合在一起,但在具有复杂逻辑的复杂项目中(这是需要DDD的地方),这绝不会发生.所以划分你的Dal和Bll.为您的DDD对象使用手工制作的类,并为Entity Framework使用自动生成(或代码优先)类,并在它们之间提供映射层.然后EAV将只是你的Dal的实现细节.如果切换到NHibernate,你的Bll和DDD类也不必改变.只是你的映射层会.顺便说一句,使用依赖倒置.让你的Dal依靠你Bll而不是相反.如果您将映射层与Entity Framework部件物理分离,则在汇编级别使用mediator模式(意味着您的映射层依赖于您的Bll和Dal,而不是任何其他方式).

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...