2011-07-07 58 views
1

發送它我們有股的EntityFramework執行的工作,所以當我們使用的ObjectContext,並向實體的任何更改它是跟蹤,然後調用SaveChanges它是所有體現在底層數據庫中。的EntityFramework,工作單位 - 跟蹤自定義數據的變化,並通過WebService的

但是,如果我想跟蹤我的自定義類的變化,所以每次修改都找到了,並通過Web服務調用發送的是什麼?

我有web服務,其提供我一些數據,即數據顯示在數據網格然後可以被修改。我想跟蹤所有的變化,然後能夠通過web服務發送只有已修改的數據。有沒有像EntityFramework或POCO之類的解決方案?或者我必須爲它實施我自己的工作單元模式?

回答

1

僅當實體附加到上下文時,更改跟蹤才起作用。有一種稱爲Self tracking entities的特殊類型的實體,它能夠在使用Web服務公開時跟蹤客戶端的更改,但這些類仍然是您的主要實體(而非自定義對象),並將其跟蹤狀態直接應用於上下文。

你描述的無關與單位的工作格局。您正在尋找能夠僅將差異傳遞迴服務的更改集模式。這些類的實現完全取決於你。 .NET不提供它們。 .NET提供了改變設定模式的兩種實現

  • 提到的自我跟蹤實體EF
  • DataSet和相關類

這兩種實現由默認傳輸的所有數據(而且至少數據集具有默認消息中的新舊狀態)。數據集和STE都有相同的限制 - 它們是very badly interoperable

0

變化是在資源層級追蹤不應該留給WCF調用的客戶機,適用於各種原因。如果您使用DTO(數據傳輸對象)模式,您應該能夠保持各個對象足夠小,以避免在整個線路上發送整個更改的對象時產生任何重大開銷。然後,在服務器端,從數據庫中加載當前版本的對象,設置DTO提供的值,並讓實體框架跟蹤更改的屬性。

public SavePerson(Person person) 
{ 
    using(var context = _contextFactory.Get()) 
    { 
     var persistentPerson = context.People.Single(p => p.PersonId == person.PersonId); 
     persistendPerson.FirstName = person.FirstName; 
     /// etc. (This could be done with a tool like AutoMapper) 
     context.SaveChanges(); 
    } 
} 

如果您要改變客戶端上的多個對象,並且你想跟蹤哪些用戶已經改變了,你可以在客戶端負責跟蹤已得到改變的對象,並批量發送這些對象到Web服務。在那裏,您可以應用相同的模式並等待SaveChanges,直到所有對象都被更新。

希望這會有所幫助。

+0

如果您要改變客戶端上的多個對象,並且你想跟蹤哪些用戶已經改變了,你可以在客戶端負責跟蹤已得到改變的對象,並只發送這些對象到批量的網絡服務。這就是我的問題如何才能讓客戶負責跟蹤良好的編碼習慣以適當的方式更改對象?我想到了在調用Save()時通過線路發送修改數據的工作單元實現。這是一個解決方案嗎? – kkris1983

+0

@ kkris1983:問題出現的方式,聽起來像您希望您的EF上下文嘗試繼續跟蹤客戶端所做的更改。如何跟蹤客戶端更改取決於客戶端框架,而不是EF/WCF。例如,如果要將實體解析爲Javascript對象,則可以輕鬆地爲每個被修改的對象添加「IsChanged = true」屬性。如果您使用Silverlight,則可以使用字典來跟蹤每個被修改的對象。 – StriplingWarrior

+0

在字典或任何其他集合中存儲更改的問題是,從WebService收到的組合對象具有包含其他類型對象集合的對象集合。因此,如果在最深的對象中進行了任何更改,則鏈中包含對象的所有對象都需要標記爲髒,並且在編輯完成後,所有內容都需要作爲參數傳遞給webservice方法調用。如何跟蹤這種變化鏈? – kkris1983