Nhibernate ORM和多对多关系

Nhibernate ORM和多对多关系,nhibernate,entity-framework,orm,many-to-many,domain-model,Nhibernate,Entity Framework,Orm,Many To Many,Domain Model,这或多或少是一个一般性的问题,而不是关于任何特定的ORM或特定的语言:不管您对ORM的偏好如何,这个问题都会出现 映射多对多关系时,可以隐藏中间表或使中间表成为模型的一部分。如果中间表具有关系之外的有价值数据,那么如何处理映射 考虑下表: CaseWorker (id, first_name, last_name) CaseWorkerCases (case_worker_id, case_id, date_opened, date_closed) Case (id, client_id, fi

这或多或少是一个一般性的问题,而不是关于任何特定的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

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

我建议一种解决方案是在模型中公开中间表,然后给CaseWork对象一个包装器属性。比如:

public IEnumerable<Case> Cases
{
    get{return (from caseWorkerCase in this.CaseWorkerCases
                select caseWorkerCase.Case);}
}
公共IEnumerable案例
{
获取{return(从这个.caseWorkerCase中的caseWorkerCase)
选择caseworcase.Case);}
}

但这似乎也是错误的。

我认为多对多映射只是两个一对多映射和中间表(如您所称)的符号缩写,可以简化关系。它仅适用于关系本身没有属性的情况。然而,随着对特定领域的理解的提高,我通常会发现多对多映射通常需要被分解以允许附加属性。因此,这些天我通常的做法是总是简单地从一对多映射开始。

我不认为您的解决方法是错误的。这些模型的复杂性必须在某个地方进行编码


我有一篇关于这个主题的博文:

我正在使用DDD。其中大部分隐藏在服务层后面。我曾参与过一个项目,其中隐藏了中间表。当Linq查询需要来自中间表的数据时,以及当您需要将该数据上传到presenter/视图(例如,显示所有打开的案例、案例工作人员和案例打开日期的GridView)时,这会导致问题。对于这个项目,我采用两层方法,但我不喜欢它产生的“丑陋”代码。
public IEnumerable<Case> Cases
{
    get{return (from caseWorkerCase in this.CaseWorkerCases
                select caseWorkerCase.Case);}
}