我的数据库中的一些表是使用EAV概念设计的. 然后我使用自动生成的实体,并将ORM实体框架的“静态”表(不是“EAV”表)表示为DDD对象. 如何使用Entity Framework在对象模型中使用我的“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,而不是任何其他方式).