在ASP.NET MVC 5和EF 6中处理并发问题的一种解决方法是使用事务和乐观并发控制。
以下是一个代码示例:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int Stock { get; set; }
1726452055
public byte[] RowVersion { get; set; }
}
public ActionResult UpdateProduct(Product updatedProduct)
{
using (var context = new YourDbContext())
{
using (var transaction = context.Database.BeginTransaction())
{
try
{
// 查询要更新的产品
var existingProduct = context.Products.Find(updatedProduct.Id);
// 检查并发冲突
if (existingProduct.RowVersion.SequenceEqual(updatedProduct.RowVersion))
{
// 更新产品信息
existingProduct.Name = updatedProduct.Name;
existingProduct.Stock = updatedProduct.Stock;
// 保存更改
context.SaveChanges();
transaction.Commit();
return RedirectToAction("Index");
}
else
{
ModelState.AddModelError("", "另一个用户已经更新了该产品,请刷新页面重新编辑。");
return View(updatedProduct);
}
}
catch (Exception ex)
{
// 处理异常
transaction.Rollback();
ModelState.AddModelError("", "更新产品时发生错误:" + ex.Message);
return View(updatedProduct);
}
}
}
}
在此示例中,我们使用了EF的乐观并发控制功能。数据库模型中的RowVersion
属性用于跟踪并发冲突。当用户尝试更新产品时,我们首先检查传递的RowVersion
是否与数据库中的值匹配。如果匹配,则更新产品并提交事务,否则返回错误消息。
注意:在并发冲突发生时,我们返回到编辑视图,并显示错误消息。用户可以在刷新页面后重新编辑。