gpt4 book ai didi

asp.net-mvc - 带有并发检查的 ASP.NET MVC + Entity Framework

转载 作者:行者123 更新时间:2023-12-03 16:55:30 25 4
gpt4 key购买 nike

我正在尝试按照此页面中的示例实现一个应用程序: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 中,我将时间戳记为隐藏字段(我使用的是 View 模型):
<%: 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 .一旦您通过 Find 加载实体您不能直接更改其时间戳。原因是时间戳是计算列。 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, "PurchaseOrder", collection);
db.SaveChanges();
}

关于asp.net-mvc - 带有并发检查的 ASP.NET MVC + Entity Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5946883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com