使用FluentNHibernate PersistenceSpecification时,单向一对多NHibernate映射失败

时间:2013-03-13 16:22:27

标签: nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我有一个域模型,其中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,它们将永远不会出现,因此这种关系是单向的。

Fluent Mappings / Schema

// 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的最新版本)。

1 个答案:

答案 0 :(得分:1)

这是因为the CheckList() method tries to save each item in the list一旦调用它就会发生。此时,父实体尚未保存 - 这不会发生until you call VerifyTheMappings()

由于关系是单向的,因此子实体(LineItem)不能保留,除非它是父(Order)的一部分,并抛出异常。 (GitHub issue

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