2

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

4

1 回答 1

1

发生这种情况是因为CheckList()方法会在您调用它时尝试将每个项目保存在列表中。此时,父实体尚未保存——直到您调用VerifyTheMappings().

由于关系是单向的,因此子实体 ( LineItem) 不能持久化,除非它是父实体 ( ) 的一部分Order,并引发异常。(GitHub问题

除了“不要费心测试列表映射”之外,我还没有解决方案。

于 2013-03-14T15:03:35.507 回答