LinqToSql MVC3更新

时间:2011-04-18 17:38:10

标签: asp.net-mvc linq-to-sql asp.net-mvc-3 datacontext

我使用ASP.NET MVC3和数据层LinqToSql。 我有点混淆如何编辑实体。

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();
}

Edit()中的变量产品没问题,但在编辑后查看[HttpPost] Edit中传递的变量 在链接属性中为null,似乎与我的DataContext分离。 还应该在EditProduct方法中执行哪些代码来更新实体?

感谢。

3 个答案:

答案 0 :(得分: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();

如果您没有时间戳列,那么L2S将抛出一个无法检查其状态的错误。

如果实体声明版本成员或没有更新检查策略,则只能在没有原始状态的情况下附加为已修改的实体。

如果您向数据库添加时间戳列,则L2S可以执行上述操作。

Here's a deeper explanation.

答案 1 :(得分: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代码可能与上面类似。
  3. (它留给读者练习使上面的代码处理异常,验证等)。

答案 2 :(得分: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);
}