3

これは多かれ少なかれ一般的な質問であり、特定の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にアクセスする一般的なタスクが厄介に見えるようになります。

1つの解決策は、モデル内の中間テーブルを公開してから、CaseWorkオブジェクトにラッパープロパティが機能するようにすることだと思います。何かのようなもの:

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

しかし、それも間違っているようです。

4

2 に答える 2

1

多対多のマッピングは、中間テーブルを使用した2つの1対多のマッピングの単なる表記上の省略形であり、関係を単純化することができます。関係に独自の属性がない場合にのみ機能します。ただし、特定のドメインの理解が深まるにつれて、通常、属性をアタッチできるように、多対多のマッピングを分解する必要があることがわかります。したがって、最近の私の通常のアプローチは、最初は常に1対多のマッピングを使用することです。

于 2011-03-17T22:16:40.410 に答える
0

私はあなたの回避策が間違っているとは思わない。これらのモデルの複雑さは、どこかにコーディングする必要があります。

この正確なトピックに関するブログ投稿があります:プロパティとの多対多の関係

于 2011-03-20T17:19:10.397 に答える