2011-08-10 115 views
2

假設我們有一個具有Order對象的Customer對象。 Order對象具有OrderDetail對象。更改實體框架中的實體狀態4.1

Customer oCustomer 
using(var context = new MyContext) 
{ 
oCustomer = context.Include("Order.OrderDetail").Find(1); 
} 
oCustomer.Name ="blah blah"; 
oCustomer.Order.Description = "blah blah"; 
oCustomer.Order.OrderDetail.Quantity = 10; 

現在,當我改變客戶的狀態如下:

using(var context = new MyContext) 
{ 
    context.Entry(oCustomer).State = EntityState.Modified. 
    context.SaveChanges(); 
} 

這僅保存oCustomer對象,而不是訂單和的OrderDetail是在oCustomer。由於context.Entry(oCustomer).State = EntityState.Modified僅改變oCustomer的狀態,而不改變Order和OrderDetail的狀態。目前,我必須手動更改ObjectGraph中每個實體的狀態,以便保存更改。有什麼辦法可以改變整個ObjectGraph的狀態,而不是隻改變父實體的狀態嗎?有沒有擴展方法或其他方法可以做到這一點?

回答

4

由於您正在切斷上下文和實體之間的鏈接,因此無。它不能自動知道所有條目處於修改狀態。

您可以創建自己的擴展方法(或將其添加到派生對象上下文類)以遍歷所有屬性並檢查它們是否映射到配置中,如果是,則將它們設置爲已修改。

我假設你在斷開連接的環境中工作,最簡單的方法是重做你在另一個過程中所做的所有更改。再次從數據庫加載實體,並填充屬性並調用保存更改。

+0

謝謝。有用!!但它是一個優雅的解決方案嗎?每次我們必須保存它們時,我們都會重新加載實體。 – Baig

+0

如果您擁有可以新建實體的所有實體信息,請將它們全部附加到上下文,並將它們全部設置爲已修改,然後調用savechanges。見http://stackoverflow.com/questions/7001602/asp-net-mvc-with-ef-4-1-navigation-properties/7008849#7008849只適用於簡單的場景。 – BennyM