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 に推測してもらいます。newCustomer
Breeze がすべてのナビゲーション パスのすべての分岐から Cookie の跡をたどった場合、何が保存されるか、保存されないかは誰にもわかりません。チェリーピックのオプションを提供します。今、自分の言いたいことを正確に言うのはあなたの責任です。
とその順序を本当に保存する必要がある場合はnewCustomer
、次のように記述できます。
var entitiesToSave = newCustomer.Orders().slice(); // コピーであることを確認してください!
entitiesToSave.push(newCustomer); // newCustomer も追加します。
manager.saveChanges(entitiesToSave); // newCustomer とその注文を保存します。
しかし、このアプローチは避けてください。変更を伴うエンティティのサブセットを保存する必要があるという状況に陥ることが多い場合は、ワークフローを再検討することをお勧めします。おそらく複数のマネージャーが必要になるでしょう...ここで説明されているように。