NHibernate中的多对多关系使用Mapping by Code

时间:2012-10-20 21:12:42

标签: c# nhibernate azure

NHibernate有一个名为Mapping by code的系统,它使开发人员可以在代码中映射他们的数据库(顾名思义)。我正在使用NHibernate 3.3.1。

我为两个班级做了这个:“Gebruiker”和“Lijst”。他们都有彼此的列表,所以这是多对多关系的典型例子。

映射如下:

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生成一个包含三列的表LijstGebruiker,除了两个预期的列之外还有一个列:elt。 Elt还使用外键引用Lijst。

根据我在互联网上发现的关于此的网站,这不应该发生,但事实确实如此。我做错了什么?

1 个答案:

答案 0 :(得分:2)

显然,这是列名等于类名时发生的某种奇怪行为。您的代码生成的映射是:

<强> Gebruiker

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

<强> Lijst

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

因此,many-to-many元素中没有列。它可能是NHibernate中的一个错误。

如果您将列重命名为Gebruiker_idLijst_id,那么一切正常。

另一种解决方案是使用多列定义方法指定列名:

<强> 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.Columns(x => x.Name("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.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>