【问题标题】:Entity Framework 6 Optimistic Concurrency with PostgreSQLEntity Framework 6 与 PostgreSQL 的乐观并发
【发布时间】:2014-03-25 16:14:48
【问题描述】:

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

public int RowVersion { get; set; }

我还有从 EntityTypeConfiguration 为每个实体继承的配置类,我在其中指定了:

this.Property(m => m.RowVersion).IsConcurrencyToken().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

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

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):

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”类型的异常,但未在用户代码中处理。存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目。

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

【问题讨论】:

  • 我建议问题是更新查询实际上并没有返回任何内容。 EF 期望返回单行。如果没有返回任何行,则假定 RowVersion 编号发生了变化

标签: c# entity-framework postgresql npgsql


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 2011-06-18
相关资源
最近更新 更多