【问题标题】:Entity Framework 6 Oracle and Optimistic ConcurrencyEntity Framework 6 Oracle 和乐观并发
【发布时间】:2017-01-06 06:45:53
【问题描述】:

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

我看到的问题是,当查询实际上没有更新行时,更新查询的行数为 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 编译错误。

通过实体框架执行时不会报告错误

依赖关系:

  • 甲骨文 12c
  • EntityFramework 6.1.3
  • Oracle.ManagedDataAccess.EntityFramework 12.1.2400

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

【问题讨论】:

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


    【解决方案1】:

    我找到了解决此错误的解决方法。当更新失败静默时,'Computed' 字段不会更新为它们的新值...而是将它们设置为 null

    因此解决方案是手动检查计算字段并手动在它们为空时抛出 DbUpdateConcurrencyException。

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

    【讨论】:

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