Order
が多数あるドメインモデルがありますLineItem
。Order
new (with new LineItems
)を作成し、それを使用PersistenceSpecification
してマッピングをテストすると、NHibernateはPropertyValueExceptionをスローします。
var order = new Order() { LineItems = new List<LineItem>() };
order.LineItems.Add(new LineItem());
new PersistenceSpecification<Order>(session)
.CheckList(o => o.LineItems, order.LineItems) // PropertyValueException
.VerifyTheMappings();
NHibernate.PropertyValueException:not-nullプロパティはnullまたは一時的な値を参照しますLineItem._Order.LineItemsBackref
ドメインモデル
public class Order {
public virtual Guid Id { get; set; }
public virtual ICollection<LineItem> LineItems { get; set; }
[...]
}
public class LineItem {
public virtual Guid Id { get; set; }
[...]
}
ALineItem
自体は面白くなく、がないと表示されないOrder
ため、関係は一方向です。
流暢なマッピング/スキーム
// OrderMap.cs
Id(x => x.Id).GeneratedBy.GuidComb();
HasMany(x => x.LineItems)
.Not.Inverse()
.Not.KeyNullable()
.Not.KeyUpdate()
.Cascade.AllDeleteOrphan();
// LineItemMap.cs
Id(x => x.Id).GeneratedBy.GuidComb();
// Schema
CREATE TABLE Orders ( Id uniqueidentifier NOT NULL, /* ... */ )
CREATE TABLE LineItems ( Id uniqueidentifier NOT NULL,
OrderId uniqueidentifier NOT NULL, /* ... */ )
LineItemsテーブルの外部キー列はNULL可能ではないため、この質問の情報に基づいて、NHibernateがNULLを挿入しようNot.KeyNullable()
としないように指定しました。Not.Inverse()
LineItem
Id
NHibernate3.3.2.400とFluentNHibernate1.3.0.733(NuGetの現在の最新バージョン)を使用しています。