2015-03-02 23 views
2

我有一個場景,我知道一個實體的主鍵(從一個不相關的源檢索),我想只更新1個屬性( db列)。我還沒有從數據庫中檢索到實體。如果可能的話,我想不必再做這個額外的往返旅程。使用breeze.js我只想發送非緩存實體的更新屬性

我使用manager.createEntity創建實體。 我更新了其中一個屬性。 然後將entityAspect設置爲setModified(); 保存更改時,所有未更新的屬性都設置爲其默認值,並且生成的SQL UPDATE語句嘗試更新所有映射列。

有沒有辦法告訴微風只爲特定的屬性/列生成SQL?

感謝

+0

Breeze(在客戶端)不生成SQL;這是在服務器上完成的。你使用哪些服務器技術? – 2015-03-02 21:45:32

+0

.net Web API和EF6與SQL Server – mwill 2015-03-02 22:20:10

+0

我想出了一個解決方案,但想知道如果是支持。我知道SQL是在EF中生成的,但是需要告訴EF要生成什麼,這是微風進入的地方。查看JSON似乎是,如果屬性位於originalValuesMap中,那麼它將包含在SQL中更新聲明。如果沒有地圖,那麼整個實體將被更新。所以在我上面的示例中,在完成所有步驟之後,我還設置了原始值:obj.entityAspect.originalValues.myProperty = 0; (myProperty是一個數字)。這正確地更新了該列。 – mwill 2015-03-03 14:45:03

回答

3

當你發現時,originalValuesMap的性質指導微風服務器的ContextProvider,因爲它準備的保存請求。這在ContextProvider topic中有記錄。

在您的示例中,您在更改屬性後調用setModified。所做的只是改變EntityState;它不會在客戶實體的entityAspect.originalValuesMap ...中創建條目,因此發送到服務器的originalValuesMap爲空。

我有點驚訝,EFContextProvider.SaveChanges準備了整個實體的EF更新。我本來會猜測它只是一起忽略了實體。我正在做一個精神筆記來調查一下自己。不是說行爲是「正確的」或「錯誤的」。

您不必操縱originalValuesMap即可實現您的目標。只需改變序列。試試這個:

var foo = manager.createEntity('Foo', { 
     id = targetId 
    }, breeze.EntityState.Unchanged); // create as if freshly queried 

foo.bar = 'new value'; // also sets 'originalValues' and changes the EntityState 

manager.saveChanges(); // etc. 

讓我們知道這是否有竅門。

+0

我的不好,我現在應該知道這一點。這工作完美。關鍵在於在對實體進行更新之前,它需要處於「未更改」狀態。我在添加狀態創建它,然後設置修改自己,這是錯誤的。這可能會將EF後端與Modifed狀態和沒有OV地圖混淆,有點像添加和更新的組合。再次感謝! – mwill 2015-03-04 17:20:08

相關問題