实体框架6 Oracle和乐观并发

时间:2017-01-05 01:45:40

标签: c# oracle entity-framework optimistic-concurrency

我遇到了Oracle和EF6乐观并发的问题。 我有一个更新触发器,它递增row_version字段并将此字段注册为ConcurrencyToken并作为DatabaseGenerated(已计算)

我看到的问题是,当查询实际上没有更新行时,更新查询的行数为1(row_version已更改为带外)

我现在正在组装一个复制品,并将在github上更新一次......

[Column("ROW_VERSION"), ConcurrencyCheck, DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public int? RowVersion { get; set; }

通过电汇的查询有点古怪:

declare
     "ROW_VERSION" number(10,0);
     "ROWID" char(18);
begin
update
     "DB"."TEST"
     set "NAME" = 'John Smith'
where (("ID" = 1) and ("ROW_VERSION" = 1))      
returning
"ROW_VERSION",
     "ROWID" into
"ROW_VERSION",
     "ROWID";
open '' /* :p4 */ for select

"ROW_VERSION" as "ROW_VERSION",
     "ROWID" as "ROWID" 
from dual;
end;

当我尝试在SQL Developer中手动运行此查询时,会导致错误:

错误消息 错误报告 - ORA-06550:第14行第6列: PLS-00707:不支持的构造或内部错误[2602] ORA-06550:第14行第1列: PL / SQL:忽略SQL语句 06550. 00000 - "行%s,列%s:\ n%s" *原因:通常是PL / SQL编译错误。

通过Entity Framework执行时,不会报告任何错误

依赖关系:

  • Oracle 12c
  • EntityFramework 6.1.3
  • Oracle.ManagedDataAccess.EntityFramework 12.1.2400

更新 我上传了一个简单的解决方案,可以重现这个问题: https://github.com/Certegy/Concurrency/

1 个答案:

答案 0 :(得分:2)

我找到了解决此错误的解决方法。当更新失败时,默认情况下会计算出' Computed'字段未更新为新值...而是将它们设置为 null

因此,解决方案是手动检查计算字段,手动抛出DbUpdateConcurrencyException(如果它们为null)。

我希望解决EF下划线问题。如果有人知道在哪里提交错误报告,请告诉我!