首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架6与PostgreSQL的乐观并发

实体框架6与PostgreSQL的乐观并发
EN

Stack Overflow用户
提问于 2014-03-26 00:14:49
回答 1查看 1.8K关注 0票数 2

我正在使用用于PostgreSQL (版本2.1.0-rc1)的Npgsql .Net数据提供程序,用于实体框架(版本2.1.0-rc1)和EF (版本6.0.2)代码优先迁移的Npgsql。在我的实体中,我有:

代码语言:javascript
复制
public int RowVersion { get; set; }

对于每个实体,我也有从EntityTypeConfiguration继承的配置类,并且我在其中指定了:

代码语言:javascript
复制
this.Property(m => m.RowVersion).IsConcurrencyToken().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

当我试图更新实体时,我的问题就出现了。我的更新方法查询数据库以获取实体,然后简单地修改字段,添加修改日期,然后调用以下被覆盖的SaveChanges:

代码语言:javascript
复制
public override int SaveChanges() {
        var objectContextAdapter = this as IObjectContextAdapter;

        if (objectContextAdapter != null) {
            objectContextAdapter.ObjectContext.DetectChanges();

            foreach (ObjectStateEntry entry in objectContextAdapter.ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)) {
                var v = entry.Entity as BaseEntity;

                if (v != null) {
                    v.RowVersion++;
                }
            }
        }

        return base.SaveChanges();
    }

数据库中的当前RowVersion为0。当代码运行时,EF生成以下SQL (从EF Profiler):

代码语言:javascript
复制
UPDATE "dbo"."Car" SET "IsObsolete"=cast(TRUE as boolean), "DateModified"=TIMESTAMP'2014-03-25T15:48:33.5833236+00:00',"ModifiedById"=1 WHERE "CarId"=32) AND ("RowVersion"=0)

这看起来很好,当我直接对数据库运行SQL时,它成功地更新了,但是在Visual Studio中,我得到了以下错误:

EntityFramework.dll中发生了'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException‘类型的异常,但未在用户代码中进行处理。Store update、insert或delete语句影响了意外的行数(0)。自加载实体以来,实体可能已被修改或删除。刷新ObjectStateManager条目。

这是我第一次在PostgreSQL中使用EF。有没有人有解决这个问题的建议?

EN

回答 1

Stack Overflow用户

发布于 2014-04-09 18:39:54

这不就是你想要发生的吗?您应该捕获DbUpdateConcurrencyException异常,然后您可以从数据库中加载(刷新)值并通知您的用户,或者在从当前存储在数据库中的值更新行版本后继续保存(客户端获胜)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22640320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档