5

多対多の関係を 1 対多の関係に置き換えることができるというインターネット上の投稿を読みました (参照する投稿が見つかりません)。誰かが例を提供できますか?

4

1 に答える 1

14

私はその質問にたどり着き、答えが欠けていることに気づきました。NHibernateのドキュメントに次のような記述があることを私はよく指摘しますが、それは残念なことです。

エキゾチックな関連付けマッピングを使用しないでください。

実際の多対多の関連付けの適切な使用例はまれです。ほとんどの場合、「リンク テーブル」に格納されている追加情報が必要です。この場合、中間リンク クラスに対して 2 つの 1 対多の関連付けを使用することをお勧めします。実際、ほとんどのアソシエーションは 1 対多および多対 1 であると考えられます。他のアソシエーション スタイルを使用する場合は注意が必要であり、それが本当に必要かどうか自問してください。

23.2の下の例を見てください。著者/作品。と の間の多対多の関係の簡略化されたバージョンを抽出AuthorWorkます。

<class name="Work" table="works" ...>
        <id name="Id" column="id" generator="native" />
        ...
        <set name="Authors" table="author_work" lazy="true">
            <key>
                <column name="work_id" not-null="true"/>
            </key>
            <many-to-many class="Author">
                <column name="author_id" not-null="true"/>
            </many-to-many>
        </set>
</class>

そしてその多対多のターゲット Author:

<class name="Author" table="authors">
  ...
  <set name="Works" table="author_work" inverse="true" lazy="true">
     <key column="author_id"/>
     <many-to-many class="Work" column="work_id"/>
  </set>
</class>

そのため、一連の Works をオンロードで注文したい場合は、問題があります。ペア テーブルには列がありません。しかし、さらに重要なことは、そのような列を管理する方法がありません。

私たちができることは、Pair オブジェクトを導入することです:AuthorWork必要に応じて Pair テーブルを拡張します。

public class AuthorWork
{

    public virtual Author Author { get; set; }
    public virtual Work Work { get; set; }
    public virtual int OrderBy { get; set; }
}

AuthorWork のマッピング

<class name="AuthorWork" table="author_work">
    ...
    <many-to-one name="Author" column="author_id" />
    <many-to-one name="Workr"  column="work_id" />
    <property name="OrderBy" />

これにより、多対多のマッピングを 1 対多に変換できます。たとえば、Authors コレクションは次のようになります。

<set name="Authors" lazy="true"
  order-by="OrderBy">
  <key column="work_id" not-null="true"/>
  <one-to-many class="AuthorWork" />
</set>

また、エンティティ AuthorWork を管理し、OrderBy 列を設定して、ペアリング テーブルを効果的に操作できます。

注: ドキュメンテーションの提案に同意する必要があります

于 2013-05-30T03:55:44.467 に答える