2011-04-18 81 views
0

我使用ASP.NET MVC3和數據層LinqToSql。 我有點混淆如何編輯一個實體。在編輯LinqToSql MVC3更新

public ActionResult Edit(int id) 
{ 
    var product = _repository.GetById(id); 
    return View(product); 
} 


[HttpPost] 
public ActionResult Edit(Product product) 
{ 
    if (ModelState.IsValid) 
    { 
     _repository.EditProduct(product); 
     return RedirectToAction("Index"); 
    } 
    return View(); 
} 

可變產物()是好的,但在編輯後查看[HttpPost]通過了可變編輯 具有鏈接屬性null並且似乎是從我的DataContext分離。 而且我應該在EditProduct方法中執行哪些代碼來更新實體?

謝謝。

回答

1

我假設你的倉庫中有一個用於你的數據上下文的對象。在你EditProduct叫你應該有這樣的:

Product prod = dataContext.Products.Single(p=>p.ProductID == product.ProductID); 

prod.PropertyA = product.PropertyA; 
prod.PropertyB = product.PropertyB; 
dataContext.SubmitChanges(); 

您還可以將產品發出,並進行保存(如果你有一個時間戳列):

dataContext.Products.Attach(product,true); 
dataContext.SubmitChanges(); 

如果沒有timestamp列,那麼L2S將拋出一個關於無法檢查其狀態的錯誤。

如果一個實體聲明一個版本成員或者沒有更新檢查策略,則它只能在沒有原始狀態的情況下作爲修改連接。

如果給數據庫添加時間戳列,那麼L2S可以完成上述操作。

Here's a deeper explanation.

+0

很好的回答方法,但使用.First方法在這裏是錯誤的。這將忽略多於一個實體匹配查詢的情況。通常情況下,你的主鍵會阻止這種事情發生,但你不想讓自己開放。改爲使用Single或SingleOrDefault。 – Milimetric 2011-04-18 17:50:56

+0

哎呀....好點...將更正代碼以反映... :-) – klabranche 2011-04-18 17:54:43

+0

我是否應該遍歷所有屬性? – 2011-04-18 17:56:15

1
public void EditProduct(Product product) { 
    using (var context = new MyContext()) { 
     var dbProduct = context.Product.Single(r => r.Id == product.Id); 
     dbProduct.Property = product.Property; 
     dbProduct.ProductCategory = context.ProductCategory.Single(r => r.Id == product.ProductCategoryId); 
     context.SubmitChanges(); 
    } 
} 
  1. 你的編輯(產品產品)方法將創建從HTTP請求參數Product實例。它使用反射來完成此操作,並查看Product類的屬性以查看與HTTP請求匹配的內容。這稱爲模型綁定,您可以更多地瞭解它是如何工作的。您的產品實例沒有鏈接並且與上下文分離的原因是因爲它是作爲新的普通對象創建的。
  2. 您的EditProduct代碼可能與上述內容類似。

(它作爲練習留給讀者作出上述處理異常,驗證等的代碼)

+0

但是,如何保存編輯過的鏈接屬性呢? – 2011-04-18 17:58:58

+0

@ Vladimir-nani你是什麼意思編輯過的鏈接屬性爲空?你的意思是你有一個編輯超鏈接,你試圖傳入一個值,它是空的? – klabranche 2011-04-18 18:14:43

+1

@Vladimir和@klabranche:不,我相信@Vladimir正在討論編輯兩個表格之間的關係(例如Product和ProductCategory)。所以,爲了展示一個例子,我編輯了上面的代碼。 – Milimetric 2011-04-18 18:20:29

0

我發現最適合我的需要

public ActionResult Edit(int id) 
{ 
    ViewBag.Categories = _repository.GetAllCategories(); 
    var product = _repository.GetById(id); 
    return View(product); 
} 


[HttpPost] 
public ActionResult Edit(int id, FormCollection collection) { 
    var product = _repository.GetById(id); 
    if (TryUpdateModel(product)) { 
     _repository.Commit(); 
     return RedirectToAction("Index"); 
    } 
    ViewBag.Categories = _repository.GetAllCategories(); 
    return View(product); 
}