4

次のデータ構造があるとします: Ordersのコレクションを持つCustomerエンティティ(1 対 n の関係)。したがって、0 個以上のOrdersの配列を返します。Customer.Orders()

ここで、新しいCustomer newCustomerと新しいOrdersエンティティ配列を作成します。このOrdersエンティティ配列はCustomerに割り当てられます。すべてのエンティティのエンティティ状態は「追加済み」です。

次に、saveChanges()次のように呼び出します。

manager.saveChanges([newCustomer])

このドキュメントに従ってsaveChanges()'sパラメータを使用しました: http://www.breezejs.com/sites/all/apidocs/classes/EntityManager.html#method_saveChanges[entities]

newCustomerとそのOrders配列の両方がサーバーに保存されることを期待していましたが、保存されたのは だけ newCustomer でした。

newCustomerとそのOrders配列を保存する方法はありますか? パラメータですべてのエンティティを渡すこともでき[entities]ますが、これは冗長であり、バグの原因となります。メソッドのみを呼び出してすべてのエンティティを保存できることはわかっていますが、特定のエンティティのみsaveChanges()を完全に保存したいと考えています。

前もって感謝します、

ベルナルド・パチェコ

4

1 に答える 1

6

2014 年 10 月 8 日更新

チェリーピッキングの変更を避けるために、私は最初のアドバイスに固執しています。

しかし、必要に応じて、@utopik のコメントで、そよ風ラボにはそのgetEntityGraphようなシナリオをかなり簡単にするプラグインがあることを思い出しました。

Breeze 自体の後にgetEntityGraph.jsプラグイン スクリプトをインストールします。次に、次のように言うことができるはずです。

// get flat array of cust and its orders
var graph = manager.getEntityGraph(newCustomer,'Orders'); 
manager.saveChanges(graph);   

ブリーズの「expand」句構文を使用して、どのナビゲーション パスを含める必要があるかを明示的に指定する必要があります。

このアプローチは、変更されたグラフ エンティティと変更されていないグラフ エンティティの両方をサーバーに送信します。変更されていないものを除外できます。

var changes = manager
    .getEntityGraph(newCustomer,'Orders')
    .filter(function(entity){
        return !entity.entityAspect.entityState.isUnchanged();
    }); 

manager.saveChanges(changes)

getEntityGraphいつか主力商品になるかもしれません。それまではそよ風のラボがあります。

元の回答

すばらしい質問です、BP。保存する必要があるエンティティを省略することについてのあなたの懸念が、呼び出しを思いとどまらせる理由saveChanges(array-of-entities)です。日常的で安全な方法は、単に を呼び出すことsaveChanges()です。これにより、保留中の変更があるすべてのエンティティが 1 つのトランザクションで保存されます。

保存する必要があるエンティティを厳選する必要がある特別なケースのために、選択的な保存のオーバーロード (あなたが試したもの) を提供しています。これを行うときは注意が必要です。関連エンティティを孤立させたくない...新しい顧客に追加した新しい注文など。あなたが正しく指摘しているように、間違いを犯すのは本当に簡単です。

親顧客の子注文を含める必要があることを Breeze に推測してもらいたいことがわかります。しかし、あなたは本当にやりたいことを Breeze に推測してもらいます。newCustomerBreeze がすべてのナビゲーション パスのすべての分岐から Cookie の跡をたどった場合、何が保存されるか、保存されないかは誰にもわかりません。チェリーピックのオプションを提供します。今、自分の言いたいことを正確に言うのはあなたの責任です。

とその順序を本当に保存する必要がある場合はnewCustomer、次のように記述できます。

var entitiesToSave = newCustomer.Orders().slice(); // コピーであることを確認してください!
entitiesToSave.push(newCustomer); // newCustomer も追加します。
manager.saveChanges(entitiesToSave); // newCustomer とその注文を保存します。

しかし、このアプローチは避けてください。変更を伴うエンティティのサブセットを保存する必要があるという状況に陥ることが多い場合は、ワークフローを再検討することをお勧めします。おそらく複数のマネージャーが必要になるでしょう...ここで説明されているように

于 2012-11-27T01:33:50.813 に答える