2016-04-13 34 views
1

我正在調查Devart.Data.Linq.ChangeConflictException: Row not found or changed的間歇性事件。*不*使用Devart獲得ChangeConflictException

我一直在閱讀關於concurrency conflicts的Devart文章,並且只是試圖重現併發衝突的一個起點。使用包含的基於MS的LINQ類很容易(使用下面的代碼結構可以成功)。然而,即使在文章中他們的例子,我不能產生一個例外。我曾嘗試

  • 同時使用ADO paramaterised查詢完全如在他們的文章
  • 使用如下圖所示(不擔心這個試驗期間注入攻擊)與新的上下文
  • 使用LinqConnect簡化ADO查詢(也在他們的文章中建議)。
  • 使用調試器暫停執行,並使用MySQL Workbench手動更新表。

這是測試代碼,我使用:

public static void MySqlTest() 
{ 
    using (MySqlDataContext db = new MySqlDataContext()) 
    { 
     Customer customer = db.Customers.First(c => c.Username.Equals("ian2")); 

     MySqlAdoChange(db.Connection); 
     //MySqlLinqConnectChange(); 

     customer.Address1 = "Original change" + DateTime.UtcNow.Ticks; 
     db.SubmitChanges(); 
    } 
} 

public static void MySqlAdoChange(DbConnection connection) 
{ 
    connection.Open(); 
    var command = connection.CreateCommand(); 
    command.CommandText = "UPDATE customers SET Address1 = 'Conflicting change" + DateTime.UtcNow.Ticks + "' WHERE Username = 'ian2'"; 
    command.ExecuteNonQuery(); 
} 

public static void MySqlLinqConnectChange() 
{ 
    using (MySqlDataContext db = new MySqlDataContext()) 
    { 
     Customer customer = db.Customers.First(c => c.Username.Equals("ian2")); 
     customer.Address1 = "Conflicting change" + DateTime.UtcNow.Ticks; 
     db.SubmitChanges(); 
    } 
} 

什麼是雙奇怪的是,兩者之間保存到數據庫交替價值! 我不得不在最後添加DateTime滴答聲以確保唯一性,否則它會優化我的更新,並且只會更新爲當前未激活的值。

任何人都可以解釋這種行爲嗎?爲什麼我不能產生ChangeConflictException?

回答

1

首先請注意,在您的示例代碼中,您更新Phone字段MySqlTest函數,但Address1字段中的MySqlAdoChange函數,因此不會有任何衝突。

但是,最有可能的是,即使你改正這一點,你也不會有更新衝突。如果你看類的源代碼,在Phone屬性,你(很可能)會看到它裝飾與列屬性與UpdateCheck = UpdateCheck.Never(這是默認的:在這裏看到https://www.devart.com/linqconnect/docs/MemberMapping.html)。因此,默認情況下,除非您通過UpdateCheck = UpdateCheck.AlwaysUpdateCheck.WhenChanged來指定要檢查的字段,否則LinqConnect不會檢查您的字段的更新衝突。當然,你不應該直接修改源代碼,而應該改變模型設計器的屬性。

+0

你當然對手機vs地址。最初我在Phone領域進行測試(實際上是一個文本字段,但不是很明顯),然後我決定使用Address來「簡化」事情,但沒有正確更新SO問題。我會研究你建議的屬性,謝謝你的信息。我還有另一個賞金問題[這裏],你可能會感興趣的是這一個(這個問題)(http://stackoverflow.com/questions/36586779/devart-changeconflictexception-but-values-still-written-to-database?lq=1)只是更大問題的一個子集。 – Ian

+0

你發現了兩次,我的變量是用'UpdateCheck = UpdateCheck.Never'屬性裝飾的_all_(禁止ID PKs)。如預期的那樣刪除它會生成一個異常。非常感謝,解決了我的一半問題。但它現在使我的另一個'ChangeConflictException'問題更加令人困惑。 – Ian