我遇到一对多关系的问题。我有以下域类:
public class Installation : Entity<Installation>
{
public virtual string Name { get; set; }
public virtual IList<Institution> Institutions { get; set; }
public Installation()
{
Institutions = new List<Institution>();
}
}
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<Institution>
{
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<Installation>
{
public InstallationMapping()
{
WithTable("Installation");
Id(i => i.Id).GeneratedBy.Guid();
Map(i => i.Name).Not.Nullable().WithLengthOf(50);
HasMany<Institution>(i => i.Institutions).KeyColumnNames.Add("InstallationId").Inverse().Cascade.All();
}
}
我通过以下方式对机构进行单元测试:
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>(installation.Id);
Assert.AreEqual(2, returnedInstallation.Institutions.Count);
我得到一个断言异常,因为返回的机构数是0.我已经检查过SQL Profiler并且机构被保存在数据库中但是它们的InstallationId为空。有人能告诉我我做错了吗?
答案 0 :(得分:5)
当您拥有inverse="false"
的持久集合时,父对象拥有该关系,对父集合的任何更改都将反映在数据库中。
当您拥有inverse="true"
的持久集合时,子对象拥有该关系,并且子对父项的引用的任何更改都将反映在数据库中。
因为您设置了inverse="true"
,所以您需要更改子对象对父对象的引用,以便NHibernate接收它。如果您希望NHibernate在添加子项或从父项集合中删除子项时接受对关系的更改,则必须在集合上设置inverse="false"
。
答案 1 :(得分:1)
您必须手动设置机构的安装属性,特别是
Installation installation = TestHelper.CreateAnonymousInstallation();
Institution institution = TestHelper.CreateAnonymousInstitution();
institution.Installation = installation;
installation.Institutions.Add(institution);