2011-05-31 44 views
3

這裏是我的控制器代碼:我可以創造一個實體,但我不能編輯一個

[HttpPost] 
public ActionResult Edit(ProductViewModel viewModel) 
{ 
    Product product = _ProductsRepository.GetProduct(viewModel.ProductId); 
    TryUpdateModel(product); 

    if (ModelState.IsValid) 
    { 
     _productsRepository.SaveProduct(product); 
     TempData["message"] = product.Name + " has been saved."; 
     return RedirectToAction("Index"); 
    } 

    return View(viewModel);  // validation error, so redisplay same view 
} 



[HttpPost] 
public ActionResult Create(CommodityCategoryViewModel viewModel) 
{ 
    Product product = new Product(); 
    TryUpdateModel(product); 

    if (ModelState.IsValid) 
    { 
     _productsRepository.SaveProduct(product); 
     TempData["message"] = product.Name + " has been saved."; 
     return RedirectToAction("Index"); 
    } 

    return View(viewModel);  // validation error, so redisplay same view 
} 

他們都調用保存()函數,定義如下:

public class ProductsRepository 
{ 
    private readonly MyDBEntities _entities; 

    public ProductsRepository() 
    {    
     _entities = new MyDBEntities(); 
    } 

    public void SaveProduct(Product product) 
    { 
     // If it's a new product, just attach it to the DataContext 
     if (product.ProductID == 0) 
      _entities.Products.Context.AddObject("Products", product); 
     else if (product.EntityState == EntityState.Detached) 
     { 
      // We're updating an existing product, but it's not attached to this data context, so attach it and detect the changes 
      _entities.Products.Context.Attach(product); 
      _entities.Products.Context.Refresh(System.Data.Objects.RefreshMode.ClientWins, product); 
     } 
     _entities.Products.Context.SaveChanges(); // Edit function hits here 
    } 
} 

當我打電話創建,它會在SaveProduct()函數中命中AddObject(),並正確保存產品。

當我調用Edit時,它只會在SaveProduct()函數中碰到_entities.Products.Context.SaveChanges(),並且不會保存產品。

我在做什麼錯?

+0

爲什麼不使用_entities.SaveChanges();代替?而且你最好使用這種模式:使用(var context = new MyDBEntities()){...}來訪問數據。 – zsong 2011-05-31 00:39:17

+0

由於您的視圖模型(ProductViewModel)與您的實體(產品)不同,您的產品對象可能不處於修改狀態。嘗試檢查已更改的實體'context.ChangeTracker.Entries()' – Eranga 2011-05-31 01:27:35

+0

@Eranga - EntityState已修改。我需要做什麼改變我的代碼? – Steven 2011-05-31 04:28:15

回答

0

取而代之的是:

// We're updating an existing product, but it's not attached to this data context, so attach it and detect the changes    
_entities.Products.Context.Attach(product);    
_entities.Products.Context.Refresh(System.Data.Objects.RefreshMode.ClientWins, product);  

嘗試:

Product origProduct =_entities.Products.Where(m=>m.ProductId == product.ProductId).Single(); 
_entities.Products.Attach(product, origProduct); 

這載荷是連接,並賦予它新的價值原來的對象。 ProductId是一個猜測......無論你的關鍵是什麼。

相關問題