2009-04-21 13 views
2

最新のFluent NHibernateライブラリ(0.1.0.452)を使用しています。子エンティティを保存する際に問題があります。Fluent NHibernate HasManyがFKを更新していない

私は、これはかなり一般的なシナリオだと思う...私はマッピングを持つ親を持っている:

HasMany<Packet>(x => x.Packets) 
      .Cascade.All() 
      .KeyColumnNames.Add("OrderId"); 

と単純なパケットクラス(ドメインモデルとFNHマッピングで)いずれかを持っていないこと親への参照。 生成されるのは、OrderIdという名前の列を含む正しいPacketsテーブルです。 保存しないと動作しません。 親オブジェクトを保存しようとすると、子も保存されますが、FKはそのまま残ります。 OrderIdが表示されないSQLとINSERT文をチェックしました!

INSERT INTO KolporterOrders (CargoDescription, SendDate, [more cols omitted]) VALUES ('order no. 49', '2009-04-22 00:57:44', [more values omitted]) 
SELECT LAST_INSERT_ID() 
INSERT INTO Packets (Weight, Width, Height, Depth) VALUES ('To5Kg', 1, 1, 1) 
SELECT LAST_INSERT_ID() 

ご覧のとおり、OrderIdは最後のINSERTには完全にありません。

私はまた、生成されたNHマッピングをチェックし、それは大丈夫だそうです:

<bag name="Packets" cascade="all"> 
    <key column="OrderId" /> 
    <one-to-many class="Company.Product.Core.Packet, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
</bag> 

私は異なる値にカスケードを設定してみました。 PacketMap(FNHマッピングクラス)にReferencesを追加しました。

OrderIdが挿入されていない理由はありますか?

編集:忘れてしまったこと:私は重要な場合はMySQL5を使用しています。

Edit2:上記のFNHマッピングは、バッグ(セットではない)でhbmを生成します - 私はそれを編集しました。節約のために使用さ C#コード:

var order = new Order(); 
NHSession.Current.SaveOrUpdate(order); //yes, order.Packets.Count == 1 here 

///Order.cs, Order ctor 
public Order() 
    { 
     CreateDate = DateTime.Now; 
     OrderState = KolporterOrderState.New; 
     Packets = new List<Packet>(); 
     Packets.Add(new Packet() 
     { 
      Depth = 1, 
      Height = 1, 
      Width = 1, 
      Weight = PacketWeight.To5Kg 
     }); 
    } 

セッションがフラッシュさとEndRequestので閉じます。

+0

オブジェクトの作成と保存を行うC#コード(失敗したコード)を表示してください。 – yfeldblum

答えて

0

"バニラ"親子オブジェクトモデルでは、NHibernateに親レコードへの子レコードの参照を更新させるために、子オブジェクトの参照を親レコードに更新する必要があります。

"反転"親子オブジェクトモデルでは、Hibernateに親レコードへの子レコードの参照を更新させるために、親オブジェクトの子オブジェクトのコレクションを変更する必要があります。

"逆"親子オブジェクトモデルを使用したがっているようです。 XMLマッピングで

、あなたは流暢マッピングで

<set name="Packets" cascade="all" inverse="true"> 
    <key column="OrderId" /> 
    <one-to-many class="Company.Product.Core.Packet, Core, 
     Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
</set> 

を必要とする、あなたは、これは本当に奇妙である

HasMany<Packet>(x => x.Packets) 
    .Cascade.All() 
    .Inverse() 
    .KeyColumnNames.Add("OrderId") 
; 
+0

これは実際に私が試みた最初の変更でした。 問題を解決しませんでした。 [F] NHはOrderIdについて何とか忘れています。 – user87338

+0

inverse = true NHibernateはこの関係を無視します。これは、あなたがそれを持っていない場合、エラーを生成する方法です: –

0

を必要としています。後続の更新をチェックする必要があります。その後、NHibernateで外部キーが更新されることがあります。その後、挿入に表示されません。

OrderIdにPacketsテーブルにいくつかの意味がないことを確認してください。これを確認するには、OrderIdの名前を別のものに変更します。

カスケードは関係ありません。子を明示的に保存する必要があるかどうかを制御します。

2

私のせいです。私はglobal.asaxのApplicationStartでテストしていたので、セッションがフラッシュされないようにリクエストが作成されていませんでした。実際にフラッシングがFK colの更新を引き起こすのを見たとき、私は単純なConsoleAppプロジェクトでテストしたときにそれを実現しました。

とにかく:ありがとうございました!

+0

これは私もテストプロジェクトを設定していたときに問題でした。ありがとう! – BradLaney

関連する問題