我正在尝试在 NHibernate 中建立一个简单的关联(这是我想从头开始使用它的第一个项目)——这似乎是一个简单的、做作的书籍示例,但出于某种原因我可以'没有得到双向工作的关系。
我有一个名为 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 表中,并且 Address 也插入到 Address 表中,只是Address 的 ixContact 字段为 NULL,与 Contact 的 ixContact 字段的值无关,因为我会期望。
如果我明确指定关系的另一端并说firstAddress.Contact = firstContact
,它可以正常工作,但我的印象是 NHibernate 会自动处理这个问题?
如果是这样,我做错了什么?还是我RandomContact.Addresses.Add(foo), foo.Contact = RandomContact
每次都必须指定?