【发布时间】: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