2010-12-30 5 views
1

JavascriptからREST Webサービスを介してJSONコレクションを送信して、Json.NETを使用して逆シリアル化し、最後にNHibernateを使用してDBで更新します)。NHibernate - 削除しない孤児 - 外部キーがnullに設定されている

私のJSONは次のとおりです。

{ 
    "ID": 1, 
    "Name": "ObjectName", 
    "Keys": [ 
    { 
     "ID": 6, 
     "Name": "ID" 
    } 
    ] 
} 

私の難しさは、私はJavaScriptで「キー」コレクションから、子を削除すると、その後の更新は唯一の子の外部キーをゼロにするということである - それは実際にはしません消して。私は親と子の両方の正しいマッピングと思われるものを設定している:

オブジェクト 1対多マッピング:

// one-to-many 
HasMany(x => x.Keys) 
    .KeyColumn("ObjectID") 
    .Cascade.AllDeleteOrphan(); 

キー多対1のマッピング:

// many-to-one 
References(x => x.Object) 
    .Cascade.None(); 
更新を実行

NHibernateのコード:

using (var transaction = Session.BeginTransaction()) 
    { 
    Session.SaveOrUpdate(entity); 
    transaction.Commit(); 
    } 
Session.Flush(); 

この例は双方向ですが、私は単方向マッピングも試みましたが、これまでのところ効果はありませんでした。アソシエーション自体が壊れていても、子レコードはデータベースに保持されます(FKはNULLに設定されます)。

明らかに欠けていることは何ですか?

答えて

2

ここで問題となるのは、Json.NETデシリアライザを通常の容量で使用すると基本的に新しいオブジェクトが作成されるということです。このオブジェクトはNHibernateによって永続化されます。最終的な結果は、データベース内のレコードが保持されます。新しい子オブジェクトコレクションに存在するすべての子オブジェクトが保持されますが、削除された子は孤立していますが、永続化されたNHibernateオブジェクトから.Remove 。クリア。

溶液は2つの部分に分かれています。まず、作業する既存のオブジェクト(マージ)のインスタンスを渡すために、Json.NETのCustomCreationConverterを使用する必要があります。

​​

出オブジェクトの子コレクションははJSONコレクションの子供たちによってに追加されるように、これだけでは、しかし、動作しません。この問題を解決し、NHibernateがオブジェクトを受け取ったときに何をすべきかを知るためには、Json.NETのハックを少し行う必要があります。再コンパイル、およびDLLを再追加した後

Json.Net>シリアル> JsonSerializerInternalReader.cs

private object PopulateList(IWrappedCollection wrappedList, JsonReader reader, string reference, JsonArrayContract contract) 
{ 
    // Edit // Clear the collection 
    wrappedList.Clear(); 

- それは動作します - JavaScriptで削除されている子どもたちが最終的にだけでなくDBから削除されます。

関連する問題