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

本文关键字:关系 一对多 简单 NHibernate 为什么 | 更新日期: 2023-09-27 17:54:35

我试图在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();

一旦我运行了这段代码,联系人就可以很好地插入到联系人表中,地址也可以插入到地址表中,除了 Address的ixContact字段是NULL,不像我所期望的那样与联系人的ixContact字段的值相关联。

如果我显式地指定关系的另一边并说firstAddress.Contact = firstContact,它工作得很好,但我的印象是NHibernate会自动处理这个?

如果是,我做错了什么?还是每次都指定RandomContact.Addresses.Add(foo), foo.Contact = RandomContact ?

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

嗯,看起来你在呼叫tx.Commit();之前错过了呼叫_session.Save(firstContact);

您确实需要显式设置关系的双方