2016-01-11 85 views
0

改變了我有這樣的一段代碼實體框架保存在收藏

public int Update(Item item) 
{ 
    using (var ctx = new DataConext()) 
    { 
     ctx.Entry(item).State = EntityState.Modified; 
     return ctx.SaveChanges(); 
    } 
} 

Class Item 
{ 
public string Name {get;set;} 
public ICollection<Foobar> Foos {get;set;} 
} 

Class Foobar 
{ 
public string FirstName {get;set;} 
public string LastName {get;set;} 
} 

比方說:

item.Foos.ElementAt(0).FirstName = "edited name" 

SaveChanged()被執行,但是我有數據庫,而不是「老」值'編輯名'...

我可以在調試中看到Local中的正確更改。

回答

2

看起來你的對象來自不同的環境,你現在正在使用的環境。在這種情況下,你不能用泛型來做到這一點,因爲你需要在你的Foobar集合中做一個foreEach並單獨改變每個項目的狀態。

你在這裏是一個斷開的實體圖,所以實體斷開連接,更改跟蹤丟失。您只設置主實體的狀態,因此EF假設其他所有內容都未更改。

Jullie勒曼的書是一個很好的來源,瞭解它是如何工作

我會做的是我會保持簡單的實體這種方法,但讓虛擬的,這樣就可以繼承該回購創建特定實體回購和覆蓋更新方法的更具體的實現適用於像你的例子那樣的實體。

幫助我設計這樣一個回購的文章是:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

0

您正在上下文中加載對象並保存在另一個上下文中。刪除using (var ctx = new DataConext())區塊,然後搜索到達加載項目的上下文的方式,然後調用SaveChanges();另一種方法是將上下文傳遞給方法,如此public int Update(Item item, DbContext context)並保存更改。

0
Class Item 
{ 
    public string Name {get;set;} 
    public ICollection<Foobar> Foos {get;set;} 
} 

您需要Include將Foos包含到對象管理器中。現在,這是急切的加載。無論你裝載物品,你必須包括它。您可以使用include。您可以使用virtual來讓它們延遲加載。

+0

我有一個斷開連接的情況。所以上下文無法跟蹤任何更改... – GrayFox