我在一对多关系方面遇到问题。我有以下域类:

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; }        
}

我根据以下内容制作了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 为空。有人可以告诉我我做错了什么吗?

有帮助吗?

解决方案

当你有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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top