我有一个域模型,其中Order
有很多LineItem
个。当我创建一个新的Order
(使用新的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; }
[...]
}
LineItem
本身并不有意思,如果没有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表中的外键列不可为空,因此基于the information in this question我指定了Not.KeyNullable()
和Not.Inverse()
以阻止NHibernate尝试插入LineItem
一个NULL Id
。
我正在使用NHibernate 3.3.2.400和FluentNHibernate 1.3.0.733(NuGet的最新版本)。
答案 0 :(得分:1)
这是因为the CheckList()
method tries to save each item in the list一旦调用它就会发生。此时,父实体尚未保存 - 这不会发生until you call VerifyTheMappings()
。
由于关系是单向的,因此子实体(LineItem
)不能保留,除非它是父(Order
)的一部分,并抛出异常。 (GitHub issue)
除了“不打扰测试列表映射”之外,我还没有解决方案。