簡體   English   中英

LINQ to SQL“ SubmitChanges()”上的“ 2個更新中的1個失敗”

[英]LINQ to SQL “1 of 2 Updates failed” on “SubmitChanges()”

我正在使用LINQ to SQL更新X類型的對象及其子對象Y,然后提交更改並得到此錯誤

范例程式碼

X objX = _context.X.ToList().Where(x => x.DeletedOn == null).First();
objX.DeletedOn = DateTime.Now;

EntitySet<Y> objYs = objX.Ys;
Y objY = objYs[0];
objY.DeletedOn = DateTime.Now;

_context.SubmitChanges();

在SubmitChanges()上,我得到一個異常“ 2個更新中的1個失敗”,沒有其他信息說明發生這種情況的原因。 有任何想法嗎?

另外,異常類型是ChangeConflictException

找出問題的原因是什么-觸發

我做了一個SQL事件探查器,看到了

當ObjY的DeletedOn屬性更新時,觸發器更新了ObjX的屬性(表中的值),稱為CountOfX

這導致錯誤,因為LINQ to SQL創建的SQL中包含舊的CountOfX值。

因此發生了沖突。

如果您遇到此錯誤-SQL事件探查器是開始調查的最佳位置

在LINQ 也不涉及這個問題我測試LINQ to SQL和ADO.net框架,正巧SQL但不是在ADO.net框架古怪此錯誤。 但是我喜歡LINQ to SQL的延遲加載功能。 等待EF退出測試版

我不確定導致錯誤的原因到底是什么,但是您提供的示例似乎存在許多問題。

  • 在Where()方法之前使用ToList()會導致您的上下文將整個表從DB讀取到內存中,並將其轉換為數組; 然后在同一行中立即調用Where,它將丟棄您已加載但不需要的行。 為什么不只是:

    _context.X.Where(...

  • Where方法將返回多個項目,但是示例中的第二行似乎並未分別遍歷每個項目。 它似乎在為集合本身設置DeletedOn屬性,但是該集合沒有這樣的屬性。 它應該在那里失敗。

  • 您在代碼中兩次使用DateTime.Now。 沒問題,只是每次調用都會產生稍有不同的日期值。 您應該調用一次DateTime.Now並將結果分配給一個變量,以便您使用它的所有內容都具有相同的值。

  • 在您擁有“ Y objY = objYs [0]”的地方,如果任何給定X的Y集合中沒有任何項目,它將失敗。您將在數組上獲得索引超出范圍的異常。

因此,在給出此示例的情況下,我不確定是否有人可以推測為什么在此示例之后建模的代碼可能會中斷。

在LINQ2SQL數據上下文圖中,選擇實體和存儲計數的字段。 (非正規化的數字)

現在設置UpdateCheck = Never。

我有這種問題。 我一次調試一行。 事實證明,另一個過程正在修改此記錄。

我的手動調試過程降低了該功能的正常速度。 當我將它一直運行到SubmitChanges方法之后的一行時,它成功了。

我的情況不太常見,但是此錯誤的性質與記錄被另一個功能/進程取代有關。 就我而言,這是另一個過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM