【发布时间】:2011-05-10 07:52:24
【问题描述】:
我正在尝试按照此页面中的示例实现一个应用程序:http://www.asp.net/entity-framework/tutorials/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application
我有一个以时间戳作为并发检查字段的域类:
public class PurchaseOrder {
[Timestamp]
public byte[] Timestamp {get; set;}
}
在我的 Edit.aspx 中,我将时间戳作为隐藏字段(我使用的是视图模型):
<%: 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 操作中再次从数据库中获取 purchaseOrder 对象:
var purchaseOrder = db.PurchaseOrders.Find(id);
所以时间戳是新的时间戳,因为之前的编辑。
但我希望 UpdateModel() 替换 formcollection 中的 Timestamp 值。 显然,情况并非如此。
如何将检索到的purchaseOrder的Timestamp的值设置为隐藏字段中的,以便检测到并发?
【问题讨论】:
-
我今天遇到了同样的问题。拉迪斯拉夫的想法是正确的。您需要将 EF 保留的原始值更改为来自您的表单的值。有几种方法可以做到这一点。
标签: asp.net-mvc entity-framework concurrency entity-framework-4.1