繁体   English   中英

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

[英]Fluent nHibernate: one-to-many relationship Issue

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

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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM