2011-11-02 30 views
0

如果使用version屬性和json rest-service進行樂觀併發,並返回僅由Id,Version和changed屬性組成的更改集的客戶端,那麼如何更新服務器端實體?如何使用json變更集更新我的實體?

我想做的是將我的json反序列化爲detatched實體,然後使用ISession.Merge方法更新我的實體。但是,我的分離實體將擁有很多屬性的空值,如果我調用合併,我的實體將被更新,這不是我想要的。如果有一種方法可以告訴合併,以忽略爲空的屬性,並保留解析我的問題的持久實體的任何相應的非空值。

如果無法配置合併行爲,我當然可以獲取持久化實體並使用反射實現我自己的合併方法。這種方法的問題是,它要求我首先查詢實體的數據庫,然後更新它,而合併方法應該將其作爲一項操作執行,除非我誤解了。

您可能會問爲什麼我只想傳遞變更集而不是整個實體。這是因爲它允許我發送最少的數據,並且還指示用戶正在嘗試更改的內容,我可以使用它來測試用戶權限。

如果在nhibernate的範圍內無法做到這一點,您將如何繼續?

+0

我會採取反思路線。它需要再往返一次,但爲您節省了很多麻煩。我認爲你可以調整一個自定義攔截器的合併,但我認爲這是不值得的,直到證明相反 – Firo

回答

0

我結束了對我的申請使用WCF Web API。我正在使用自定義媒體格式化程序,包裝Json.NET。這使我能夠反序列化爲泛型和派生類型,這非常棒,非常有用。

我有一個ChangeSet對象,它有幾個屬性,其中最重要的是名稱值字典。通過這個設置,我可以定義服務操作對象爲ChangeSet。不過,我必須明確刪除XmlMediaFormatter。它拋出錯誤,因爲它無法反序列化這些複雜的對象。

檢查用戶權限以更改這些屬性後,我從存儲庫中獲取對象,使用反射更新變更集中的屬性,並將其保存回存儲庫。

如果我是誠實的,那就很好用。 :)