2012-07-23 15 views
1

我一直在閱讀和語境不更新

我已經達到了部分書「臨ASP.Net MVC3框架第三版」弗里曼A.和桑德森S.以下,他們告訴我如何更新實體。一切工作正常,除了更新。

我有一個頁面來編輯商店中的物品。很基本。當我改變頁面中的值,並提交它們時,它們以他們應該使用新值的方式實現我的存儲庫。

現在,這本書說明了我,我的倉庫(SaveProduct)下面的方法:

namespace SportsStore.Domain.Concrete 
{ 
    public class EFProductRepository : IProductRepository 
    { 
     private EFDbContext context = new EFDbContext(); 
    public IQueryable<Product> Products 
    { 
     get { return context.Products; } 
    } 
    public void SaveProduct(Product product) 
    { 
     if (product.ProductID == 0) 
     { 
      context.Products.Add(product); 
     } 
     context.SaveChanges(); 
    } 
} 
} 

這種方法的工作原理,但它不保存我的產品。我不完全處於MVC3的模糊性之上,所以我被卡住了。該產品作爲SaveProduct方法中的參數到達,具有正確的值,應該保存,但上下文不會更新。

這是在MVC3更新的東西嗎? (這本書有點過時了嗎?)因爲我可以用if來編寫代碼來單獨檢查所有的值,但我不禁感到這會取消MVC3/Entity Framework的功能。

任何人都可以幫我嗎?非常感謝! :)在此期間,我會調試並尋找任何線索!

編輯:

當我趕上的SaveChanges()返回時,它似乎是零的整數。所以我猜想具有新值的實體不會更新到實體框架。

編輯2:

我已經找到了問題(已經)。似乎我太快地提出問題,對此我表示歉意。下面是我做的:

我下面的代碼添加到方法SaveProduct:

public void SaveProduct(Product product) 
    { 
     if (product.ProductID == 0) 
     { 
      context.Products.Add(product); 
     } 
     else 
     { 
      var productInDb = context.Products.FirstOrDefault(x => x.ProductID == product.ProductID); 
      context.Entry(productInDb).CurrentValues.SetValues(product); 
     } 
     context.SaveChanges(); 
    } 

我想這是這樣做的一個適當的方式?對不起,沒用的問題:)

+0

我認爲context.Products.Add(產品); 應該是context.Products.AddObject(product); – 2012-07-23 00:59:38

回答

1

問題是該實體沒有被您的EFDbContext跟蹤,所以當您撥打context.SaveChanges();時,它不知道它需要更新它。

因此,您需要確保上下文知道跟蹤實體的狀態。

基本上有這樣的兩種方式 - 要麼你在你的第二編輯列表,也可以手動「附加」的實體範圍內,並標記爲修改,如通過以下方式:

context.Products.Attach(product); 
context.Entry(product).State = EntityState.Modified;