【问题标题】:ORM and many-to-many relationshipsORM 和多对多关系
【发布时间】:2011-03-17 19:29:50
【问题描述】:

这或多或少是一个笼统的问题,与任何特定的 ORM 或语言无关:无论您的 ORM 偏好如何,都会出现这个问题。

映射多对多关系时,可能会隐藏中间表或使中间表成为模型的一部分。如果中间表有超出关系的有价值数据,如何处理映射?

考虑下表:

CaseWorker (id, first_name, last_name)
CaseWorkerCases (case_worker_id, case_id, date_opened, date_closed)
Case (id, client_id, field_a, field_b)

作为一名程序员,我真的希望能够做到:

CaseWorker.Cases

比

CaseWorker.CaseWorkerCases.Cases

一方面,表 CaseWorkerCases 包含有用的数据,隐藏中间表使得访问该数据不太方便。另一方面,必须在中间表中导航会使访问 Cases 的常见任务看起来很尴尬。

我认为一种解决方案可能是在模型中公开中间表,然后为 CaseWork 对象提供一个可以工作的包装器属性。比如:

public IEnumerable<Case> Cases
{
    get{return (from caseWorkerCase in this.CaseWorkerCases
                select caseWorkerCase.Case);}
}

但这似乎也是错误的。

【问题讨论】:

  • 我正在使用 DDD。其中大部分隐藏在服务层后面。我从事过一个隐藏中间表的项目。当 Linq 查询需要来自中间表的数据以及当您需要将该数据提供给演示者/视图时(例如,显示所有打开的案例、案例工作者和案例打开日期的 GridView),这会导致问题。对于这个项目,我采用了两层方法,但我不喜欢它产生的“丑陋”代码。

标签: nhibernate entity-framework orm many-to-many domain-model


【解决方案1】:

我认为多对多映射只是两个具有中间表的一对多映射的符号缩写,正如您所说的那样,可以简化关系。它仅适用于关系没有自身属性的情况。但是,随着对特定领域的理解的提高,我通常发现通常需要分解多对多映射以允许附加属性。所以这些天我通常的做法是总是简单地使用一对多的映射开始。

【讨论】:

    【解决方案2】:

    我认为您的解决方法没有错。这些模型的复杂性必须在某处进行编码。

    我有一篇关于这个确切主题的博文:Many-to-many relationships with properties

    【讨论】:

      猜你喜欢
      • 2012-09-18
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2017-09-30
      • 2012-10-27
      相关资源
      最近更新 更多