asp.net-mvc – 带有并发检查的ASP.NET MVC实体框架
发布时间:2020-12-16 04:38:26 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试按照此页面中的示例实现应用程序: http://www.asp.net/entity-framework/tutorials/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application 我有一个带有Timestamp的域类作为并发检查字段: public class PurchaSEOrder
我正在尝试按照此页面中的示例实现应用程序:
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 – IIS 7:将所有请求重定向到Default.aspx
- asp.net-mvc-3 – 如何使用ASP.NET MVC 3“Razor”查看引擎
- asp.net-mvc-3 – MVC3:超出最大请求长度
- ASP.NET可以在C#中设置会话超时值
- ASP.NET MVC使用JQuery将页面内容加载到div中
- iis-7.5 – aspnet_compiler无法映射路径’/’
- asp.net-mvc – Mvc – 在会话中存储列表,然后检索其值
- asp.net-mvc – 我如何编写一个MVC3 / 4应用程序,它既可以作
- asp.net-mvc – 使用401发送消息:Asp.net Web-api
- asp.net – Server.Transfer对Google不可见吗?
推荐文章
站长推荐
- WeihanLi.Npoi 近期更新
- asp.net-mvc – Ajax重定向到页面而不是更新目标
- asp.net – 在Web应用程序中排队长时间运行的任务
- asp.net-mvc – 后退按钮不会导致回发到MVC中的控
- asp.net – HttpContext.GetGlobalResourceObjec
- asp.net-mvc-3 – 不支持使用相同的DbCompiledMo
- asp.net-mvc – 如何从FilterAttribute中获取当前
- asp.net-mvc – 在MVC WebApi中的方法如何映射到
- asp.net-web-api – Hot Towel / Durandal / Bre
- asp.net-mvc-3 – .NET MVC 3自定义控制器属性
热点阅读