簡體   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