流暢な nHibernate:1対多の関係の問題
-
12-09-2019 - |
質問
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 です。誰か私が間違っていることを教えてくれませんか?
解決
永続的なコレクションがある場合、 inverse="false"
, の場合、親オブジェクトがリレーションシップを所有し、親のコレクションに対する変更はデータベースに反映されます。
永続的なコレクションがある場合、 inverse="true"
, の場合、子オブジェクトがリレーションシップを所有し、親への子の参照に対する変更はデータベースに反映されます。
あなたが設定したから inverse="true"
, 、NHibernate がそれを認識できるようにするには、子オブジェクトの親オブジェクトへの参照を変更する必要があります。親のコレクションに子を追加したり、親のコレクションから子を削除したりするたびに、関係への変更を Hibernate に反映させたい場合は、次のように設定する必要があります。 inverse="false"
コレクションについて。
他のヒント
インスティテューションのインストール プロパティを手動で設定する必要があります。具体的には、
Installation installation = TestHelper.CreateAnonymousInstallation();
Institution institution = TestHelper.CreateAnonymousInstitution();
institution.Installation = installation;
installation.Institutions.Add(institution);
所属していません StackOverflow