2010-12-29 12 views
2

JavascriptからREST Webサービスを介してJSONコレクションを送信して、Json.NETを使用して逆シリアル化し、最後にNHibernate(Fluentを使用しています)を使用してDBで更新します。 。私はJson.NETデシリアライズするために使用している設定は、次のとおりです。Json.NETとNHibernate - 永続オブジェクトの逆シリアル化

 JsonConvert.DeserializeObject<T>(jsonString, 
     new JsonSerializerSettings { 
      PreserveReferencesHandling = PreserveReferencesHandling.Objects 
     }); 

私のJSONオブジェクトです:

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

は、オブジェクトのプロパティの変更、さらには子オブジェクト(キー)を追加し、変更し、デシリアライズは素晴らしい作品です。しかし、私は子オブジェクトの削除を管理する方法を考えることができません。たとえば、子オブジェクト(Object.Keys.spliceを使用)を削除してから更新すると、更新された親オブジェクトにそれらが含まれていなくても、関連するDBレコードは永続的なままです。

また、マッピングファイルに「AllDeleteOrphan」も設定しました。

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

オブジェクトがデシリアライズされて更新されたときに、javascriptで削除された子オブジェクトがカスケードされるようにする方法はありますか?

また、NHibernateを使用している場合、更新前に子オブジェクトを親コレクションから手動で削除する必要があります(Keys.Remove(item)経由)。デシリアライズして更新するほうがはるかに好ましい(スケーラビリティはもちろん)。万一?

答えて

2

これらの変更をカスケードで更新して見ることができるはずですが、問題はコレクションが逆であるとマークされていることと関係していると思います。

Inverse = true(これはnhibernateの.Inverse()がバインドされています)は、「この関係を管理していません」というようなものです。この結合のために、親オブジェクトは、子が関係を管理するため、コレクションの削除/更新ではありません。

これが意味をなさないかどうかにかかわらず、あなたのドメインを完全に理解していないと、私は本当に言えませんでした。

+0

お返事ありがとうございます。私はそれを削除しようとし、まだ削除の問題があります。 Inverseタグは、関係のどちら側が関係(関係)自体ではなく、保存(レコード)の責任を負っていたと私は常に考えているので、混乱しますか? – Stumblor

+0

すべて保持する - マッピングからInverse()を削除すると、DBの外部キーがnullになるという効果がありました。孤児たちを取り除くだけで、勝利することができます。ありがとう。 – Stumblor

+0

こんにちは、外部キーを無効にするのではなくレコードを削除する方法を考えましたか? – CraftyFella

関連する問題