3

1対多の関係に問題があります。私は次のドメインクラスを持っています:

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プロファイラーをチェックインし、機関はデータベースに保存されていますが、InstallationIdがnullです。誰かが私が間違っていることを教えてもらえますか?

4

2 に答える 2

5

を使用した永続的なコレクションがあるinverse="false"場合、親オブジェクトが関係を所有し、親のコレクションへの変更はデータベースに反映されます。

を使用した永続的なコレクションがあるinverse="true"場合、子オブジェクトが関係を所有し、子の親への参照に対する変更はデータベースに反映されます。

を設定inverse="true"したため、NHibernateが子オブジェクトを取得するには、親オブジェクトへの子オブジェクトの参照を変更する必要があります。親のコレクションに子を追加したり、親のコレクションから子を削除したりするたびにNHibernateが関係の変更を取得するようinverse="false"にするには、コレクションを設定する必要があります。

于 2009-09-21T13:12:07.510 に答える
1

教育機関のインストールプロパティを手動で設定する必要があります。具体的には、

Installation installation = TestHelper.CreateAnonymousInstallation();
Institution institution = TestHelper.CreateAnonymousInstitution();
institution.Installation = installation;
installation.Institutions.Add(institution);
于 2009-09-21T12:55:25.907 に答える