2017-01-05 73 views
2

我遇到了Oracle和EF6樂觀併發問題。 我有一個更新觸發器,其遞增row_version領域,並已註冊了該領域的ConcurrencyToken併爲DatabaseGenerated(計算機)實體框架6 Oracle和樂觀併發

我看到的問題是,更新查詢具有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:不支持ORA-06550:第14行,第1列: PL/SQL:忽略SQL語句 06550. 00000 - 「行%s,列%s:\ n%s」 *原因:通常PL/SQL編譯錯誤。

當通過實體框架的執行沒有錯誤報道

依賴關係:

  • 甲骨文12C
  • 的EntityFramework 6.1.3
  • Oracle.ManagedDataAccess.EntityFramework 2400年1月12日

UPDATE 我已上傳一個簡單的解決方案,它再現了問題: https://github.com/Certegy/Concurrency/

回答

1

我已經找到了解決方法,以解決這個bug。當更新默默地失敗'計算'字段不會更新到它們的新值...而是它們被設置爲null

因此,解決方案是手動檢查計算字段並手動如果它們爲空則拋出DbUpdateConcurrencyException。

我希望下劃線EF錯誤得到解決。如果有人知道在哪裏提交錯誤報告,請讓我知道!