我使用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方法中执行哪些代码来更新实体?
感谢。
答案 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可以执行上述操作。
答案 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();
}
}
(它留给读者练习使上面的代码处理异常,验证等)。
答案 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);
}