【问题标题】:EAV within entity framework 4 and ddd实体框架 4 和 ddd 中的 EAV
【发布时间】:2010-12-21 08:09:52
【问题描述】:

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

  1. 如何使用 Entity Framework 在对象模型中使用我的“EAV”实体(而不是在数据库中的关系)?

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

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

我可以使用由实体框架和部分部分生成的报告实体 在 getter 中实现一些逻辑,用于从我的 EAV 表中检索数据以填充 Collection ReportProperies。然后它引出了下一个问题。

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

如果我将使用 DDD 对象,我可以将其用于 Entity Framework 或 NHibernate,这对我来说几乎是不可能的,因为我需要在我的 DAO 中的每个过程中调用映射过程。

【问题讨论】:

  • Konst,你能解释一下“EAV”代表什么吗?此外,如果您将问题的格式设置得更好一些,它可能会帮助您获得回复。
  • eav 是 ddd 的对立面,ddd 是“使隐式显式”并且在 eav 中没有什么是显式的恕我直言
  • 正如@remibourgarel 所说,EAV 不适合 DDD,EAV 是关于解决关系数据库问题以表示对象,而 DDD 即将拥有不具有持久性的代码。

标签: entity-framework-4 domain-driven-design entity-attribute-value


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-21
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2011-02-25
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多