流利的nHibernate:一对多的关系问题

我有一对多关系的问题。 我有以下域类:

public class Installation : Entity { public virtual string Name { get; set; } public virtual IList Institutions { get; set; } public Installation() { Institutions = new List(); } } public class Institution : Entity { public virtual string Name { get; set; } public virtual string Address { get; set; } public virtual string City { get; set; } public virtual Installation Installation { get; set; } } 

我根据以下post制作了Entity基类。 我定义了以下映射:

 public class InstitutionMapping : ClassMap { public InstitutionMapping() { WithTable("Institution"); Id(i => i.Id).GeneratedBy.Guid(); Map(i => i.Name).Not.Nullable().WithLengthOf(50); Map(i => i.Address).Not.Nullable().WithLengthOf(50); Map(i => i.City).Not.Nullable().WithLengthOf(50); References(i => i.Installation).ColumnName("InstallationId").Not.Nullable().WithForeignKey(); } } public class InstallationMapping : ClassMap { public InstallationMapping() { WithTable("Installation"); Id(i => i.Id).GeneratedBy.Guid(); Map(i => i.Name).Not.Nullable().WithLengthOf(50); HasMany(i => i.Institutions).KeyColumnNames.Add("InstallationId").Inverse().Cascade.All(); } } 

我通过以下方式对机构进行unit testing:

 Installation installation = TestHelper.CreateAnonymousInstallation(); installation.Institutions.Add(TestHelper.CreateAnonymousInstitution()); installation.Institutions.Add(TestHelper.CreateAnonymousInstitution()); session.Save(installation); session.Flush(); session.Clear(); Installation returnedInstallation = session.Get(installation.Id); Assert.AreEqual(2, returnedInstallation.Institutions.Count); 

我得到一个断言exception,因为返回的机构数是0.我已经检查了SQL Profiler并且机构被保存在数据库中但是它们的InstallationId为空。 有人能告诉我我做错了什么吗?

当您拥有inverse="false"的持久集合时,父对象拥有该关系,对父集合的任何更改都将反映在数据库中。

当你有一个使用inverse="true"的持久集合时,子对象拥有该关系,并且对子对父对象的引用的任何更改都将反映在数据库中。

因为你设置inverse="true" ,你需要更改子对象对父对象的引用,以便NHibernate接受它。 如果您希望NHibernate在添加子项或从父项集合中删除子项时接收关系的更改,则必须在集合上设置inverse="false"

您必须手动设置机构的安装属性,具体而言,

 Installation installation = TestHelper.CreateAnonymousInstallation(); Institution institution = TestHelper.CreateAnonymousInstitution(); institution.Installation = installation; installation.Institutions.Add(institution);