2016-04-19 6 views
0

この質問は他のarticleに由来します。私は現在Entity FrameworkでBreezeJSを使用していますが、意図したとおりに使用しているとは思いません。現在、私は、サーバーに送信して元の構造にデシリアライズしているエンティティの配列に変更を保存しています。私はこれを行うためのより良い方法があることを願っています。私は今見つけられませんでした。私はこれを行うことができますが、それらを働かせることができないことがわかります2つの方法があります。BreezeJS saveChangesはオブジェクトの代わりに配列を送信します

最初に、デシリアライズされたオブジェクトが既にオブジェクト構造内にある単一のオブジェクトとして配列を送信することです。オブジェクトが保持されている形式のクライアント側であれば、それ以上の作業は必要ありません。

2番目のオプションは、サーバーに送信された配列を何とか使用して、EFContextProvider内のEntity Frameworkメタデータを使用してオブジェクト構造を構築することです。

可能であれば、私はオプション1に近いソリューションを希望します。

Javascriptを

function saveObjects() { 
    // Assume the child class has a foreign key to the parent 
    var parent = dataService.createEntity('PARENT', parentObject); 
    var child = dataService.createEntity('CHILD', childObject); 

    // Save changes 
    // This is what I'm currently doing because each entity is seperate 
    dataService.saveChanges([parent, child]); 
    // This is what I would like to do 
    // dataService.saveChanges(parent); 
} 

現在送信されたオブジェクトは、次のようになります。私はCHILDを実際に親オブジェクト内の子にして、それが送信されるようにします。

// Current saveBundle 
{"entities": [ 
    {"ID: 1, 
    "entityAspect": {"entityTypeName": "PARENT", ...}}, 
    {"PARENT_ID: 1, 
    "entityAspect": {"entityTypeName": "CHILD", ...}} 
]} 

// Ideal saveBundle 
{"entities": [ 
    {"ID: 1, 
     {"PARENT_ID: 1, 
     "entityAspect": {"entityTypeName": "CHILD", ...}}, 
    "entityAspect": {"entityTypeName": "PARENT", ...}}, 

]} 

C#

[HttpPost] 
public SaveResult SaveChanges(JObject saveBundle) 
{ 
    // Currently I have to deserialize each object and rebuild the object 
    // because the save bundle is a list of single entities instead of 
    // the existing object hierarchy 
    PARENT parent = DeserializeEntity(saveBundle, 'PARENT'); 
    parent.child = DeserializeEntity(saveBundle, 'CHILD'); 

    // Custom Validation and Saving is done here 
} 

Iが誤っBreezeJSを用いてもよいが、検証およびデータベース節約はさらにラインの下の別個のモジュールで行わ。私はちょうど真ん中の手作業の一部を取り除こうとしています(オブジェクト構造を再構築する必要があります)。

+0

エンティティがクライアント上で関連している場合でも、JSONにシリアル化するときに循環参照の問題が発生しないように、Breezeはエンティティを配列に分割します。サーバー上で、EFContextProviderはそれらをEFコンテキストに追加します。 EFは、このプロセス中にオブジェクトグラフを自動的に再構成します。 –

+0

それは問題です、私はこれがどのように行われるかの例を見つけることができません。サーバーでは、送信されたエンティティの配列がありますが、EFContextProviderを使用して配列からオブジェクトを構築する方法を理解できません。 –

+0

しかし、あなたが自動的にあなたのためにそれをするとき、なぜあなたはそれをする必要がありますか? –

答えて

0

問題を解決する方法の1つは、BeforeSaveEntitiesメソッドで作業を行うことです。そこでは、エンティティはすでにデシリアライズされていますが、まだオブジェクトグラフにはありません。 EFにオブジェクトグラフを配置するには、別のコンテキスト(保存に使用されているのと同じものではない)にそれらを添付します。

詳細はthis SO question and answerを参照してください。

関連する問題