2012-11-26 37 views
4

假設我有以下數據結構:一個客戶具有集合訂單(1對n關係)的實體。所以,Customer.Orders()返回一個零或更多的數組訂單如何使用EntityManager的saveChanges()方法保存單個實體?

現在,我創建一個新的客戶newCustomer,和一個新的訂單實體陣列。這訂單實體數組被分配給客戶。所有實體都具有「已添加」實體狀態。

然後,我打電話saveChanges()如下:

manager.saveChanges([newCustomer]) 

我根據本文檔中使用的saveChanges()[entities]參數:http://www.breezejs.com/sites/all/apidocs/classes/EntityManager.html#method_saveChanges

我期望的是,newCustomer及其訂單陣列將被保存在服務器中,但僅保存newCustomer

有什麼辦法可以保存newCustomer及其訂單數組?也許我可以通過[entities]參數中的所有實體,但這將是詳細的並且是一個錯誤點。我知道我只能撥打saveChanges()方法來保存所有實體,但我想完全保存只有一個特定的實體。

由於提前,

貝爾納多·帕切科

回答

6

更新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

+0

偉大的@Ward!我會按照你的意見,避免這種做法。謝謝! –

+0

@BernardoPacheco - 很明顯,有時候你想要一個簡單的方法從一個聚合根開始從緩存中獲取對象圖。 DevForce開發者有「FindEntityGraph」。如果你想要[用戶語音]投票(http://breezejs.uservoice.com/forums/173093-breeze-feature-suggestions/suggestions/3439337-entitymanager-getentitygraph-get-a-root-entity-s)它在Breeze也是「getEntityGraph」。 – Ward

+0

@Ward這仍然是要走的路?當您同時編輯多個實體(即儀表板)並且希望一次只保存一個實體時,會非常痛苦(使用Angular)。您不知道需要保存哪些嵌套實體(可能是訂單,聯繫人,服務,訂單*和*聯繫人,...)。 - 我剛剛爲'getEntityGraph'增加了3個投票數 – Utopik

相關問題