2013-06-02 70 views
0

Breeze在保存這些數據時沒有看到服務器端數據發生了什麼。微風團隊表示,你必須重新查詢更新的數據。可以考慮在保存期間同步完成的操作,如sql觸發器(expl。之後插入),因爲這些操作可以在保存過程中轉換實體,因此它們將在客戶端進行:這對於不是由Breeze生成的新鍵非常有用,如多部分鍵。我很難解決這個問題。幫幫我?breeze和sql server觸發器

更新1: 如果這是Breeze的原則,它可能是一個錯誤。

1)觸發(在服務器端)是所使用的實體(表的一部分)

2)框架:

  • 服務器端框架:.NET框架4.5
  • 客戶框架:微風1.3.5
  • 視圖框架:敲除2.2.1

3)從調用SaveChanges結果情形:

function saveTousRecos() { 
    return manager.saveChanges() 
      .then(success) 
      .fail(fail); 
     function success(saveResult) { 
      /* do your post-save work here */ 
      axi = saveResult.entities[0].jobtab(); 
     // axi is an identity key generated at server and sent back to client by Breeze 
     // result : Breeze value = (195), the same as server-side (195) 
      ara = saveResult.entities[0].seqtab(); 
     // ara is a property value inserted by sql FOR INSERT trigger, 
     // result : Breeze value = (NULL), server-side has (13) 
      logger.log("Saving succeded... "); 
     } 
     function fail(error) { 
      logger.log("Saving failed: " + error.message); 
     } 
    } 

P.S. :除非您從服務器重新調用實體,而不是從緩存中重新調用實體,否則SQL觸發器插入的所有值都根本不可見;看起來像一個解決方案,而不是我想的解決方案。

更新2: 我認爲,微風認爲我回實體的OData喜歡。

從我的微風阿比controlleur 1)我用這個:

return _contextProvider.Context.clients.Where(uc => uc.refclie == rqnoclie); 

2)微風說: 隨着的OData,服務器端計算字段的值的任何變化將不會在微風可用更新後。如果你需要刷新這些值,你必須重新查詢...

3)所以從現在開始,我的解決方案是REQUERY(不是好消息)來獲得我的計算結果或觸發結果。希望BeforeSaveEntity攔截器的未來將解決這個問題。或者我如何獲得Breeze的純實體(不是OData,而是計算或觸發的服務器端)?有沒有辦法擺脫這種麻煩?

回答

0

The Breeze EFContextProvider重新查詢它保存的實體並將它們發送回客戶端。因此,如果這些觸發器更新正在保存的實體,它將通過SQL觸發器將更新的值發送回客戶端。例如,如果您保存實體「A」並且觸發器更新實體「A」的值,則EFContextProvider將重新查詢「A」並將這些更新的值發送給客戶端。

讓我們知道,如果你能證明這是不是真的。我相信這將是一個錯誤。

微風不知道......也不可能知道......由SQL觸發更新大約其他實體。當您保存實體「A」並且沒有理由查詢「B」並將其發送給客戶端時,Breeze無法知道實體「B」已通過觸發器更新。

+0

@sbelini感謝您的幫助病房,但我認爲困難留下來。我更新了我的答案,試圖證明Breeze不會將sql觸發器的更新結果返回給客戶端。不知道這是否是一個錯誤。 –

+0

我對重新查詢的評論是w/r/t Web API數據源,而不是OData數據源(關於我幾乎不知道的數據源)。我們將嘗試重現您所描述的內容並回報。 – Ward