gpt4 book ai didi

c# - Entity Framework 6 与 PostgreSQL 的乐观并发

转载 作者:行者123 更新时间:2023-11-29 12:21:15 24 4
gpt4 key购买 nike

我正在为 PostgreSQL(版本 2.1.0-rc1)、 Entity Framework (版本 2.1.0-rc1)和 EF(版本 6.0.2)Code First 迁移使用 Npgsql .Net 数据提供程序。在我的实体中,我有:

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 中我收到以下错误:

“System.Data.Entity.Infrastructure.DbUpdateConcurrencyException”类型的异常发生在 EntityFramework.dll 中,但未在用户代码中处理。存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目。

这是我第一次将 EF 与 PostgreSQL 结合使用。有人对解决这个问题有什么建议吗?

最佳答案

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

关于c# - Entity Framework 6 与 PostgreSQL 的乐观并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22640320/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com