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 – e.CommandArgument for asp按钮不工作
- asp.net – ASP .NET核心Cookie身份验证到期时返回时从时间
- ASP.Net MVC Cookies不会持续存在
- asp.net – 问题映射HttpHandler – HTTP错误404未找到
- asp.net-mvc – 更新到MVC 5后,iframe不再有效
- asp.net-mvc – 如何使用ViewBag创建一个下拉列表?
- asp.net – 在Visual Studio 2012中创建控制器时出错
- asp.net-mvc – 在mvc下拉列表中自动恢复
- asp.net – On-Session-expire-event?
- asp.net-mvc – 如何添加代码隐藏页面到视图或部分视图
- ASP.NET:使用混合的HTML格式本地化内容
- asp.net – 在日期字段中插入空值?
- 在ASP.NET菜单控件中设置item.selected
- asp.net Web.config 详细配置说明
- asp.net核心 – Asp.Net核心从url获取RouteData值
- IIS ASP.Net网站 – ManagedPipelineHandler错误
- asp.net-mvc – ASP.NET MVC将表单值传递给actio
- 为什么从ASP.NET页面下载时,.docx文件被损坏?
- asp.net – 为什么网站项目中缺少global.asax
- asp.net-mvc – 创建自定义RouteBase类
