2

Orderが多数あるドメインモデルがありますLineItemOrdernew (with 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: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; }
    [...]
}

ALineItem自体は面白くなく、がないと表示されない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テーブルの外部キー列はNULL可能ではないため、この質問の情報に基づいて、NHibernateがNULLを挿入しようNot.KeyNullable()としないように指定しました。Not.Inverse()LineItemId

NHibernate3.3.2.400とFluentNHibernate1.3.0.733(NuGetの現在の最新バージョン)を使用しています。

4

1 に答える 1

1

これはCheckList()メソッドを呼び出すとすぐに、メソッドがリスト内の各項目を保存しようとするために発生します。この時点では、親エンティティはまだ保存されていません。これは、 を呼び出すまでVerifyTheMappings()保存されません。

リレーションシップは一方向であるため、子エンティティ ( LineItem) は親 ( ) の一部でない限り永続化できずOrder、例外がスローされます。( GitHubの問題)

「リストマッピングをテストしないでください」以外に、これに対する解決策はまだありません。

于 2013-03-14T15:03:35.507 に答える