为什么这个简单的NHibernate一对多关系不是双向的?

时间:2011-05-04 16:49:42

标签: c# nhibernate bidirectional

我正在尝试在NHibernate中建立一个简单的关联(这是我想从头开始使用它的第一个项目) - 它看起来像一个简单,人为的书籍例子,但对于某些人来说我不能双向工作的原因。

我有一个名为Contact的类,它可以包含许多地址。

以下是简化的Contact类:

public class Contact {

// firstName, lastName, etc, etc omitted

// ixContact is the identity value
public virtual int ixContact { get; set; }
public virtual ICollection<Address> addresses { get; set; }

}

这是地址:

public class Address {
       public virtual int ixAddress { get; set; }
       public virtual Contact contact { get; set; }
}

这是映射文件的相关部分,Contact.hbm.xml:

<id name="ixContact">
    <generator class="hilo" />
</id>

<bag name="Addresses" inverse="true" cascade="save-update">
     <key column="ixContact" />
     <one-to-many class="Address />
</bag>

这是Address.hbm.xml映射文件的相关部分:

<id name="ixAddress">
    <generator class="hilo" />
</id>

<many-to-one name="contact" class="Contact" column="ixContact" />

鉴于该设置,我运行以下代码:

_configuration = new Configuration();
    _configuration.Configure();
    _configuration.AddAssembly(typeof(Contact).Assembly);

    _sessionFactory = _configuration.BuildSessionFactory();

    _session = _sessionFactory.OpenSession();

    new SchemaExport(_configuration).Execute(false, true, false);

    Contact firstContact = new Contact { firstName = "Joey", middleName = "JoeJoe", lastName = "Shabadoo" };

    using( ITransaction tx = _session.BeginTransaction()) {

           firstContact.Addresses = new List<Address>();
           Address firstAddress = new Address { /* address data */ };

        firstContact.Addresses.Add(firstAddress);

      _session.SaveOrUpdate(firstContact);

      tx.Commit();
    }


    _session.Close();

    _session.Dispose();

一旦我运行了这段代码,Contact就被插入到Contact表中了,地址也被插入到地址表中,除了,地址的ixContact字段为NULL,与之无关正如我所料,Contact的ixContact字段的值。

如果我明确指定关系的另一面并说出firstAddress.Contact = firstContact,它可以正常工作,但我的印象是NHibernate自动处理这个问题?

如果是这样,我做错了什么?或者我每次都要指定RandomContact.Addresses.Add(foo), foo.Contact = RandomContact吗?

2 个答案:

答案 0 :(得分:0)

嗯,在致电_session.Save(firstContact);

之前,您似乎错过了电话tx.Commit();

答案 1 :(得分:0)

您需要明确设置关系的两面。