功能NHibernate:一个一对多的关系问题(Fluent nHibernate: one-to-

2019-07-18 18:17发布

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

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

我已经按照下面的步骤进行实体基类岗位 。 我有以下映射定义:

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事件探查器检查和机构都保存在数据库中,但他们的InstallationId为空。 有人能告诉我什么,我做错了什么?

Answer 1:

当你有一个持续的收集与inverse="false" ,则父对象拥有的关系和父集合的任何更改将在数据库中反映出来。

当你有一个持续的收集与inverse="true" ,那么子对象拥有的关系和孩子的参照母公司的任何更改将在数据库中反映出来。

因为你设置inverse="true" ,你将需要改变,以便子对象的引用父对象为NHibernate的就可以了回升。 如果你想NHibernate的挑上的变化的关系,只要添加的孩子或删除父集合中的孩子,你必须设置inverse="false"的集合。



Answer 2:

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

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


文章来源: Fluent nHibernate: one-to-many relationship Issue