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-mvc – ASP.NET MVC获取具有特定配置文件属性的用户
 - 使用C#读取dbf行情文件
 - ASP.NET和System.Diagnostics跟踪 – 我错过了什么,或者这是
 - kendo-ui – 剑道网格刷新(数据绑定两次)
 - asp.net fileupload控件上传文件与多文件上传
 - .net – RESTful WCF的裸最低配置
 - asp.net – 网站在解决方案构建后需要很长时间才能启动
 - ASP.NET缓存的方法和最佳实践
 - ASP.NET core Web中使用appsettings.json配置文件的方法
 - asp.net-mvc – 为什么在我的ASP MVC4应用程序中重定向资源
 
- asp.net – 使用umbraco的iis应用程序池使用过多
 - azure – 获取#error = unsupported_response_ty
 - asp.net-mvc – 使用ASP.NET MVC进行项目组织的最
 - 过滤ASP.NET Core API中的属性
 - asp.net-mvc – 在部署MVC 2 Web应用程序时要绝对
 - asp.net-mvc – 使用jQuery.post将多个参数发布到
 - VS 2013 RC中缺少ASP.NET Web窗体脚手架功能
 - asp.net-mvc – 从Api控制器内生成绝对的url to
 - ASP.NET MembershipProvider加密/解密
 - asp.net – WebFormsMVP的缺点?
 
