我遇到了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执行时,不会报告任何错误
依赖关系:
更新 我上传了一个简单的解决方案,可以重现这个问题: https://github.com/Certegy/Concurrency/
答案 0 :(得分:2)
我找到了解决此错误的解决方法。当更新失败时,默认情况下会计算出' Computed'字段未更新为新值...而是将它们设置为 null 。
因此,解决方案是手动检查计算字段,手动抛出DbUpdateConcurrencyException(如果它们为null)。
我希望解决EF下划线问题。如果有人知道在哪里提交错误报告,请告诉我!