我正在調查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?
你當然對手機vs地址。最初我在Phone領域進行測試(實際上是一個文本字段,但不是很明顯),然後我決定使用Address來「簡化」事情,但沒有正確更新SO問題。我會研究你建議的屬性,謝謝你的信息。我還有另一個賞金問題[這裏],你可能會感興趣的是這一個(這個問題)(http://stackoverflow.com/questions/36586779/devart-changeconflictexception-but-values-still-written-to-database?lq=1)只是更大問題的一個子集。 – Ian
你發現了兩次,我的變量是用'UpdateCheck = UpdateCheck.Never'屬性裝飾的_all_(禁止ID PKs)。如預期的那樣刪除它會生成一個異常。非常感謝,解決了我的一半問題。但它現在使我的另一個'ChangeConflictException'問題更加令人困惑。 – Ian