我有一个域模型,其中 aOrder
有很多LineItem
s。当我创建一个新的Order
(使用 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:非空属性引用空值或瞬态值 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
本身并不有趣,没有 a 就永远不会出现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 表中的外键列不可为空,因此根据我指定的这个问题中的信息,Not.KeyNullable()
并Not.Inverse()
防止 NHibernate 尝试插入LineItem
带有 NULL的 a Id
。
我正在使用 NHibernate 3.3.2.400 和 FluentNHibernate 1.3.0.733(来自 NuGet 的当前最新版本)。