2011-06-15 41 views
12

G'day All,有沒有人購買過Apress Pro Asp.net MVC框架3的ALPHA並創建了SportsStore?我無法編輯產品並讓數據庫更新成功?沒有錯誤顯示,單元測試全部正常,但沒有成功的「編輯」,即我改變了一些細節,點擊保存,報告成功 - 然後檢查結果,什麼都沒有發生?在通過SportsStore工作時是否有其他人發現這一點?任何意見將不勝感激。Apress Pro Asp.net MVC框架3 - SportsStore編輯產品無法正常工作?

乾杯。

+8

對於那些有同樣的問題,我不得不添加:'context.Entry(product).State = EntityState.Modified; //使用system.data;'到EFProductRepository/SaveProduct。否則不會爲我工作 - 我隱式地遵循了這些例子。 – 2011-06-16 00:32:21

+0

Omg,我以爲我做錯了什麼!這裏很棒的問題! ++ 1 – ThdK 2012-02-02 07:19:34

+0

我還沒有能夠獲得源代碼的工作有人可以壓縮一個工作版本?我已經編譯好了,但是它有Ninject的問題,它似乎是 – punkouter 2012-05-08 14:39:34

回答

-1

嘗試用MVC 3本

public ActionResult Edit(Product product) 
    { 
     if (ModelState.IsValid) 
     { 
      Product p = repository.Products.FirstOrDefault(x => x.ProductID == product.ProductID); 
      if (p != null) 
      { 
       p.ProductID = product.ProductID; 
       p.Price = product.Price; 
       p.Category = product.Category; 
       p.Description = product.Description; 
       p.Name = product.Name; 
      } 
      else 
       p = product; 
      repository.SaveProduct(p); 
      TempData["message"] = string.Format("{0} has been saved", product.Name); 
      return RedirectToAction("Index"); 
     } 
     else 
     { 
      return View(product); 
     } 
    } 

IM初學者,但我認爲,參考模型(產品參數)是不綁定到EF上下文

1

請嘗試以下Product對象。這個想法是,產品PARAM是MVC模式結合到操作方法不與EF syn'ing,所以我們需要把它assocaite到倉庫:

public ActionResult Edit(Product product) 
{ 
    if (ModelState.IsValid) 
    { 
     ((ObjectSet<Product>)repository.Products).ApplyCurrentValues(product); 

     repository.SaveProduct(product); 
     TempData["message"] = string.Format("{0} has been saved", product.Name); 
     return RedirectToAction("Index"); 
    } 
    else 
    { 
     return View(product); 
    } 
} 
0

我使用最終版本的遇到了同樣的問題Apress Pro ASP.NET MVC3。使用Visual Studio調試器時,我注意到當執行context.SaveChanges()(SportsStore.Domain.Concrete.EFProductRepoistory)時,上下文並未更改爲我們在編輯視圖中所做的更改。儘管在SaveProduct()

所以我猜所有我們不得不做的構造函數中定義的產品是改變Context.Products.Product到產品的構造像這裏面:

 else 
     { 
      context.Products.Find(product.ProductId) = product; 
     } 

不幸的Visual Studio給了我這個錯誤:

Error 1 The left-hand side of an assignment must be a variable, property or indexer

因此使其工作,我不得不這樣做:

 else 
     { 
      context.Products.Find(product.ProductID).Name = product.Name; 
      context.Products.Find(product.ProductID).Description = product.Description; 
      context.Products.Find(product.ProductID).Category = product.Category; 
      context.Products.Find(product.ProductID).Price = product.Price; 
     } 

這是行不通的。但是我認爲這遠非理想,並不是實現這一目標的最佳方式。

有沒有辦法做到這一點,我只是編輯/更新上下文中的整個Product對象,而不是逐個編輯每個屬性?

12

保存之前需要更新EF對象的狀態。

public void SaveProduct(Product product) 
     { 
      if (product.ProductID == 0) 
      { 
       context.Products.Add(product); 
      } 
      else 
      { 
       context.Entry(product).State = System.Data.EntityState.Modified; 
      } 


      int result = context.SaveChanges(); 

     } 
3

我還不能發表評論,但我想通過展示你的最後一個方法應該讀什麼添加到MVC新手的評論:

public void SaveProduct(Product product) { 
    if (product.ProductID == 0) { 
     context.Products.Add(product); 
    } else { 
     context.Entry(product).State = EntityState.Modified; 
    } 
    int numSaved = context.SaveChanges(); 
} 

另外不要忘記添加額外的使用聲明(再次通過MVC新手提及):

//using system.data; 
+1

希望這可以幫助其他*(已經不幸在這本Apress書上浪費他們的錢)*從浪費了我在這個問題上的時間。 使用本書時要記住的主要事情並不是假設你的代碼不起作用就是錯誤的。往往不是這本書的代碼。如果不起作用,請在此處搜索代碼。 ;) 儘管我覺得我從書中的錯誤中學到了更多東西*(而且它有很多!)*比書中的其他部分還要多! LOL – GazB 2011-09-15 07:57:13

+0

感謝這對我完美的工作:) – 2011-10-15 07:02:01

0
public void SaveProduct(Product product) 
{ 
    var prod = context.Products.SingleOrDefault(p => p.ProductID == product.ProductID); 
    if (product.ProductID > 0) 
    { 
     context.Products.Remove(prod); 
    } 
    context.Products.Add(product);    
    context.SaveChanges(); 
} 
+0

請提供解釋給你的代碼。 – 2012-11-06 12:30:33

-1

下面是答案

public void SaveProduct(Product product) 
    { 
     var prod = context.Products.SingleOrDefault(p => p.ProductID == product.ProductID); 

     if (product.ProductID > 0) 
     { 
      context.Products.Remove(prod); 
     } 
      context.Products.Add(product);    
      context.SaveChanges(); 
    } 
+1

這將創建一個具有原始ID的新產品。這也是我第一次嘗試解決這個問題。這也使得對數據庫的要求更多,而不是需要。 – ThdK 2012-02-02 07:22:08

相關問題