0

我正在開發一個將公開WCF服務的應用程序。我在DAL上使用Entity Framework 4.1。問題是當我加載一些實體(比如說一個客戶有順序,而順序又有OrderDetail)。加載它之後,我在Customer,Order和OrderDetail對象中進行了一些更改(添加了一些新訂單,並刪除/更新了一些現有訂單),並將對象圖發送到WCF服務以進行更新,如下所示。WCF,實體框架4.1和實體的狀態

Customer oCustomer; 
using(var context = new MyContext) //MyContext is dbContext 
{ 
    oCustomer = context.Include("Order.OrderDetail").Find(1); 
} 

oCustomer.Name ="blah blah"; 
Order oOrder1 = oCustomer.Order.Where(obj=>obj.Id == 2); 
oOrder1.Description = "blah blah"; 
oOrder1.OrderDetail.Quantity = 10; 

Order oOrder2 = new Order { ... } //properties of Order are set. 
oCustomer.Order.Add(oOrder2); 

oCustomer.Order.Remove(context.Order.Find(1)); 

ServiceClient client = new ServiceClient(); 
client.SaveCustomer(oCustomer); 

現在,當我收到客戶的更新ObjectGraph在服務器端,我不知道哪個訂單被除去,進行了修改,因爲沒有changetracking現在。我如何確定要刪除哪個訂單以及要修改哪個訂單?有什麼方法可以跟蹤實體框架4.1中對象圖中的更改嗎?

注意:以前我使用自追蹤實體來解決這個問題,但是我必須擺脫STE,因爲我的WCF服務也將被Java客戶端應用程序使用。所以,STE不適合我。

回答

2

據瞭解,除了自我跟蹤實體(你不能像你說的那樣使用)之外,沒有辦法跟蹤分離的對象圖的變化。

我通常做的更新分離圖的方法是從數據庫中重新加載原始圖,比較原始圖和變化圖(手寫代碼),看看哪些實體已被添加,修改和刪除,將更改寫入原始並保存上下文。

這個過程(一個父和子集,例如客戶和訂單的集合)的一個例子是在這個問題的答案:The relationship could not be changed because one or more of the foreign-key properties is non-nullable

它不幸變得相當複雜,如果你要處理一個更深層次的實體。據我所見,EF並沒有提供任何形式的自動合併將改變後的圖形合併到原始文件中,僅用於實體只具有已改變的標量和複雜屬性的非常簡單的情況。一旦涉及導航屬性,您不再需要EF的支持,而必須自己編寫更新邏輯。

3

我想知道回答你的問題是否有意義,因爲它看起來像你沒有閱讀答案。

您向question about STEs詢問並獲得有關其可用性的意見。

  • 我加入它被明確地描述它們不是可互操作的場景
  • 理查德張貼了關於國營貿易企業和有關自定義更改跟蹤很好的聯繫紐帶 - 順便說一句。這正是你正在尋找的

你可能沒有讀過這些答案,因爲你使用了STE,之後你問了一個問題how to use STEs in Java client

什麼更加讓我感到吃驚,你沒有關於STE和EFv4.1

今天重複自己的問題,你已經獲得了在another your question這個問題的答案。

那麼你期望什麼答案?如果你沒有閱讀答案,是否值得回答你的問題?

答:

沒有STE模板的DbContext,一旦你不使用國營貿易公司必須handle change tracking completely yourselves因爲EF不幫你。在上一個問題中描述了最簡單的方法 - 再次在服務中加載對象圖並將傳入圖合併到附加實體,以便上下文可以跟蹤更改。更復雜的解決方案在您之前關於STE的問題之一中提供的鏈接@Richard中進行了描述 - 您必須爲每個轉移的實體添加一些狀態屬性,並且客戶端必須正確設置它們並將它們發回給您,以便您可以手動設置正確一旦你附加了他們,每個實體的狀態 - 在一些關係的情況下,這可能有點複雜。

+0

感謝您的指導。但是,我一直在閱讀所有的答案。我同意我的一些問題在某種意義上是重複的。爲了尋求更好更優雅的解決方案,我必須這樣做。 – Baig