Entity framework 4 实体框架4和ddd中的EAV

Entity framework 4 实体框架4和ddd中的EAV,entity-framework-4,domain-driven-design,entity-attribute-value,Entity Framework 4,Domain Driven Design,Entity Attribute Value,我的数据库中的一些表是使用EAV概念设计的。 然后,我使用ORM实体框架自动生成并表示“静态”表(而不是“EAV”表)的实体作为DDD对象 我如何使用实体框架在对象模型中使用我的“EAV”实体(而不是像在数据库中那样在关系模型中使用) 例如, 在数据库中,我有静态表Report和EAV表,它们帮助我存储Report的ReportProperty。 在域模型中,我希望有这样的报告: Report { ICollection<ReportProperty> ReportProp

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

  • 我如何使用实体框架在对象模型中使用我的“EAV”实体(而不是像在数据库中那样在关系模型中使用)
  • 例如,
    在数据库中,我有静态表Report和EAV表,它们帮助我存储Report的ReportProperty。
    在域模型中,我希望有这样的报告:

    Report
    {
         ICollection<ReportProperty> ReportProperties{get;set;}
    }
    
    报告
    {
    ICollection ReportProperties{get;set;}
    }
    
    我可以使用实体框架生成的报表实体,并在部分章节中使用 在getter中实现一些逻辑,用于从EAV表检索数据以填充集合报告属性。然后它引出了下一个问题

  • 如果我决定使用NHibernate而不是实体框架,我该怎么办?因为我不能使用我已经意识到使用实体框架的部分部分

  • 如果我将使用DDD对象,我可以将其用于实体框架或NHibernate,这对我来说很难,因为我在DAO的每个过程中都需要调用映射过程。

    EAV是数据访问层的概念,而DDD是业务逻辑层的概念。类似ORM的实体框架或NHibernate引诱我们将这两个层混合在一起,但在具有复杂逻辑的复杂项目中(这就是需要DDD的地方),这永远不会发生。所以把你的Dal和Bll分开。为DDD对象使用手工制作的类,为Entity Framework使用自动生成(或代码优先)的类,并在它们之间提供映射层。那么EAV将只是Dal的一个实现细节。此外,如果您切换到NHibernate,您的Bll和DDD类也不必更改。只需映射层即可。顺便说一下,使用依赖倒置。让你的Dal完全依赖你,而不是相反。如果将映射层与实体框架部分物理上分离,那么在组装级别上使用中介模式(这意味着映射层取决于Bll和Dal,而不是其他方式)。

    Konst,您能解释一下“EAV”代表什么吗?另外,如果你把问题的格式设置得更好,它可能会帮助你得到答案。eav与ddd相反,ddd是“使隐式显式”,在eav中,没有什么是显式的,正如@remibourgarel所说,eav不适合ddd,eav是解决关系数据库问题来表示对象,而DDD即将拥有不持久感知的代码。