asp.net-mvc-3 – 实体框架乐观并发异常未发生
我们有一个ASP.Net MVC应用程序,它使用EF4作为其数据访问层,我们看到当我们认为它们应该是没有抛出OptimisitcConcurrencyExceptions时的意外行为.
我们已将问题简化为以下代码… using System.Linq; using Project.Model; namespace OptimisticConcurrency { class Program { static void Main() { Contact firstContact = null; using (var firstEntities = new ProjectEntities()) { firstContact = (from c in firstEntities.Contacts where c.LastName == "smith" select c).Single(); } using (var secondEntities = new ProjectEntities()) { var secondContact = (from c in secondEntities.Contacts where c.LastName == "smith" select c).Single(); secondContact.Title = "a"; secondEntities.SaveChanges(); } firstContact.Title = "b"; using (var thirdEntities = new ProjectEntities()) { var thirdContact = (from c in thirdEntities.Contacts where c.LastName == "smith" select c).Single(); thirdContact.Title = firstContact.Title; //EXPLICITLY SET VERSION HERE thirdContact.Version = firstContact.Version; thirdEntities.SaveChanges(); } } } } 这是我们的MVC应用程序中发生的相当简单的版本,但是会出现同样的问题. 当我们在第三个Entity上调用SaveChanges时,我期待异常并没有抛出任何东西. 更有趣的是,当我们附加SQL事件探查器时,我们看到版本正在where子句中使用,但它是使用的第三个版本的值(数据库中的当前值),而不是第一个实体值DESPITE它是立即显式设置的在调用SaveChanges之前. SaveChanges正在将版本重置为检索的值而不是设置值. 在EDMX中,Version设置为StoreGeneratedPattern设置为Computed. 任何人都知道这里发生了什么? 解决方法
这是个问题.将列设置为Computed后,您无法在应用程序中设置其值(您可以但不使用该值).
编辑: 如果从数据库加载实体,则默认情况下会跟踪上下文.上下文存储其原始值.原始值例如用于快照更改跟踪,但它们也用作Computed属性的唯一有效源.如果在实体中设置Computed属性,则不使用该值,并使用insted原始值.解决方法是修改原始值(在修改其他任何内容之前): using (var context = new TestEntities()) { var entityToUpdate = context.MyEntities.Single(e => e.Id == someId); entityToUpdate.Timestamp = entity.Timestamp; ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(entityToUpdate); entry.ApplyOriginalValues(entityToUpdate); // set modified properties context.SaveChanges(); } 编辑2: 顺便说一句.一旦你有实际加载的时间戳和以前检索的时间戳,你可以简单地compare them in your application而不是在数据库中这样做. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在不刷新ASP.NET网页上的整个页面的情况下刷新内容的最佳布
- 组合密钥资源REST服务
- asp.net – 会话存储在客户端或服务器端
- asp.net-mvc-4 – WebAPI OData 5.0 Beta – 访问GlobalCon
- 已部署的ASP.Net站点中的可编辑资源文件
- asp.net-mvc – 为什么@ Html.AntiForgeryToken()在同一个响
- asp.net验证文本框 – 至少有一个文本框必须包含数据
- asp.net – URL没有可用扩展名时重定向
- asp.net-mvc – 使用ASP.NET MVC,如何在外部控制器上显示错
- asp.net – 标签导航 – 框架还是AJAX?
- 用HttpClientFactory来实现简单的熔断降级
- 使用asp.net mvc中的Ajax将文件和文本上传到服务
- asp.net-mvc – MVC 4提供的反伪造令牌是为用户“
- asp.net – Application_Error – GetLastError(
- asp.net-mvc – 如何在点击电子邮件超链接时打开
- asp.net – 以编程方式从GridView添加和删除事件
- asp.net – specflow的.msi安装程序和它的nuget包
- asp.net – 什么原因“内部连接致命错误”
- asp.net-mvc-4 – 发布后保留表单值(不是模型的一
- asp.net – MSCharts“没有找到HTTP请求类型”GE