1

NHibernateには、コードによるマッピングと呼ばれるシステムがあり、開発者はデータベースをコードでマッピングすることができます(名前が示すとおり)。NHibernate3.3.1を使用しています。

私はこれを「Gebruiker」と「Lijst」の2つのクラスで行いました。それらは両方ともお互いのリストを持っているので、これは多対多の関係の典型的な例です。

マッピングは次のとおりです。

Gebruiker

        Set(l => l.Lijsten, map =>
            {
                map.Table("LijstGebruiker");
                map.Cascade(Cascade.All);
                map.Inverse(true);
                map.Key(k => k.Column("Gebruiker"));
            }, map => map.ManyToMany(p => p.Column("Lijst")));

Lijst

         Set(l => l.Gebruikers, map =>
             {
                 map.Table("LijstGebruiker");
                 map.Cascade(Cascade.All);
                 map.Key(k => k.Column("Lijst"));
             }, map => map.ManyToMany(p => p.Column("Gebruiker")));

私の知る限り、これにより、Gebruiker列とKey列を持つテーブル「LijstGebruiker」が作成されます。

代わりに:NHibernateは、3つの列を持つテーブルLijstGebruikerを生成します。予想される2つの列に加えて1つが追加されます:elt。Eltは、外部キーを使用するLijstも指します。

これについてインターネットで見つけたウェブサイトによると、これは起こらないはずですが、そうです。私は何が間違っているのですか?

4

1 に答える 1

2

どうやら、これは、列名がクラス名と等しいときに発生したある種の奇妙な動作です。コードによって生成されるマッピングは次のとおりです。

ゲブルイカー

<set name="Lijsten" table="LijstGebruiker" inverse="true" cascade="all">
   <key column="Gebruiker" />
   <many-to-many class="Lijst" />
</set>

ライトスト

<set name="Gebruikers" table="LijstGebruiker" cascade="all">
  <key column="Lijst" />
  <many-to-many class="Gebruiker" />
</set>

したがって、many-to-many要素に列はありません。NHibernate のバグである可能性があります。

列の名前を に変更するGebruiker_idLijst_id、すべて正常に動作します。

別の解決策は、複数の列定義方法を使用して列名を指定することです。

ゲブルイカー

Set(l => l.Lijsten, map =>
{
    map.Table("LijstGebruiker");
    map.Cascade(Cascade.All);
    map.Inverse(true);
    map.Key(k => k.Column("Gebruiker"));
}, map => map.ManyToMany(p =>
{
    p.Columns(x => x.Name("Lijst"));
}));

ライトスト

Set(l => l.Gebruikers, map =>
{
    map.Table("LijstGebruiker");
    map.Cascade(Cascade.All);
    map.Key(k => k.Column("Lijst"));
}, map => map.ManyToMany(p =>
{
    p.Columns(x => x.Name("Gebruiker"));
}));

コードによって生成されるマッピングは次のとおりです。

<set name="Lijsten" table="LijstGebruiker" inverse="true" cascade="all">
  <key column="Gebruiker" />
  <many-to-many class="Lijst">
    <column name="Lijst" />
  </many-to-many>
</set>

<set name="Gebruikers" table="LijstGebruiker" cascade="all">
  <key column="Lijst" />
  <many-to-many class="Gebruiker">
    <column name="Gebruiker" />
  </many-to-many>
</set>
于 2012-10-21T08:00:03.827 に答える