更新2014年10月8日
我和我原來的建議堅持以避免櫻桃採摘的變化。
但是,如果你必須的話,我會提醒@ utopik的評論breeze labs has the getEntityGraph
plugin這可能會使這種情況更容易。
安裝getEntityGraph.js微風本身之後的插件腳本。然後,你應該能夠說:
// get flat array of cust and its orders
var graph = manager.getEntityGraph(newCustomer,'Orders');
manager.saveChanges(graph);
你必須列明所其導航路徑應該用微風列入「擴大」子句語法。
該方法將發送更改和未修改的圖形實體到服務器。你可以濾除那些不變:
var changes = manager
.getEntityGraph(newCustomer,'Orders')
.filter(function(entity){
return !entity.entityAspect.entityState.isUnchanged();
});
manager.saveChanges(changes)
getEntityGraph
可以使之成爲核心產品一天。在那之前,有微風實驗室。
Original Answer
優秀的問題,英國石油公司。您關於省略應該保存的實體的擔心是爲什麼我們不鼓勵撥打saveChanges(array-of-entities)
。常規,安全的事情只需撥打saveChanges()
即可。這將節省每個實體在一次交易中有未決更改。
我們爲特殊情況提供了選擇性保存超載(您嘗試過的),在這種情況下您需要櫻桃選擇應該保存的實體。你這樣做時一定要小心;您不想孤兒相關的實體...例如您添加到新客戶的新訂單。犯錯誤真的很容易......正如你正確指出的那樣。
我可以看到你希望微風推斷它應該包括父母的客戶的子訂單。但是你要求Breeze猜測你真正想做什麼。如果Breeze沿着從每條導航路徑的每個分支向下的newCustomer
的cookie蹤跡,誰知道它會保存或不保存?我們給你選櫻桃的選擇;現在你有責任準確地說出你的意思。
如果你真的需要保存newCustomer
,其命令,你可以寫:
var entitiesToSave = newCustomer.Orders().slice(); // Make sure it's a copy!
entitiesToSave.push(newCustomer); // add the newCustomer too.
manager.saveChanges(entitiesToSave); // save newCustomer and its orders.
但我求求你避免使用此方法。如果您經常發現自己需要隨時更改實體的子集,我強烈建議您重新檢查一下您的工作流程。也許你需要多個經理... as described here。
偉大的@Ward!我會按照你的意見,避免這種做法。謝謝! –
@BernardoPacheco - 很明顯,有時候你想要一個簡單的方法從一個聚合根開始從緩存中獲取對象圖。 DevForce開發者有「FindEntityGraph」。如果你想要[用戶語音]投票(http://breezejs.uservoice.com/forums/173093-breeze-feature-suggestions/suggestions/3439337-entitymanager-getentitygraph-get-a-root-entity-s)它在Breeze也是「getEntityGraph」。 – Ward
@Ward這仍然是要走的路?當您同時編輯多個實體(即儀表板)並且希望一次只保存一個實體時,會非常痛苦(使用Angular)。您不知道需要保存哪些嵌套實體(可能是訂單,聯繫人,服務,訂單*和*聯繫人,...)。 - 我剛剛爲'getEntityGraph'增加了3個投票數 – Utopik