我有一个域模型,其中 aOrder有很多LineItems。当我创建一个新的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 的当前最新版本)。