asp.net-mvc – 带有并发检查的ASP.NET MVC实体框架

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 带有并发检查的ASP.NET MVC实体框架前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试按照此页面中的示例实现应用程序: http://www.asp.net/entity-framework/tutorials/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application

我有一个带有Timestamp的域类作为并发检查字段:

public class PurchaSEOrder {
    [Timestamp]
    public byte[] Timestamp {get; set;}
}

在我的Edit.aspx中,我将Timestamp作为隐藏字段(我正在使用视图模型):

<%: Html.HiddenFor(model => model.PurchaSEOrder.Timestamp) %>

这是我的Edit()方法

public ActionResult Edit(int id,FormCollection collection) {
     var purchaSEOrder = db.PurchaSEOrders.Find(id);
     UpdateModel(purchaSEOrder,"PurchaSEOrder",collection);

     db.Entry(purchaSEOrder).State = EntityState.Modified;
     db.SaveChanges();
}

我同时在2个独立的浏览器中打开了相同的编辑页面(以便它们的时间戳相同),并一个接一个地更新它们.

当我更新第二页时,我预计会出现DbUpdateConcurrencyException.但我没有.

我认为发生的是在第二页中,我在Edit操作中再次从DB获取purchaSEOrder对象:

var purchaSEOrder = db.PurchaSEOrders.Find(id);

因此,由于之前的编辑,时间戳是新的时间戳.

但我希望UpdateModel()从formcollection中替换Timestamp值.
显然,事实并非如此.

如何将检索到的purchaSEOrder的Timestamp值设置为隐藏字段,以便检测并发性?

解决方法

It doesn’t work this way.一旦您通过查找加载实体,您无法直接更改其时间戳.原因是时间戳是计算列. EF保存每个加载实体的内部原始值和当前值.如果更改已加载实体中的值,则仅更改当前值,并且在更新期间,EF将原始值与当前值进行比较,以了解必须更新哪些列.但是在计算列的情况下,EF不会这样做,因此你永远不会使用你改变的值.

有两种解决方案.第一个是不从数据库加载实体:

public ActionResult Edit(int id,FormCollection collection) 
{
     // You must create purchase order without loading it,you can use model binder
     var purchaSEOrder = CreatePurchaSEOrder(id,collection);
     db.Entry(purchaSEOrder).State = EntityState.Modified;
     db.SaveChanges();
}

第二个解决方案是在ObjectContext API的链接问题中描述的小黑客.如果您需要这个用于DbContext API,您可以尝试以下方法

public ActionResult Edit(int id,FormCollection collection) 
{
     var purchaSEOrder = db.PurchaSEOrders.Find(id);
     purchaSEOrder.Timestamp = GetTimestamp(collection);
     // Overwrite original values with new timestamp
     context.Entry(purchaSEOrder).OriginalValues.SetValues(purchaSEOrder);
     UpdateModel(purchaSEOrder,collection);
     db.SaveChanges();
}

猜你在找的asp.Net相关文章