次のような双方向の関連付けがあります。
public class Parent
{
public int ParentId {get; set;}
...other properties
public IEnumerable<Child> Children {get; set;}
}
public class Child
{
public int ChildId {get; set;}
...other properties
public Parent Parent {get; set;}
}
流暢なマッピングは次のとおりです。
親マッピング
Id(x => x.ParentId, "PARENT_ID").GeneratedBy.Identity();
.. other mappings
HasMany(x => x.Children).Cascade.All().KeyColumn("PARENT_ID");
子マッピング
Id(x => x.ChildId, "CHILD_ID").GeneratedBy.Identity();
.. other mappings
References(x => x.Parent).Column("PARENT_ID").Cascade.None();
次のようなコードを実行すると:
Parent parent = new Parent{ ..set some properties... };
parent.Children = new[] { new Child{ ..set some properties.. };
session.Save(parent);
PARENT_ID
NHibernateが子レコードを挿入しようとしたときに子レコードの列を新しい ID に設定していないため、外部キー制約違反が発生します。
のマッピングでカスケードを要求したことは明らかですParent
。NHibernate は子を保存しようとしていますが、ID が設定されていないのはなぜですか?