2011-04-18 133 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); 
}