[英]Why does LINQ to SQL report a conflict on Windows Phone, when the database doesn't appear to have one?
我有一個Web服務正在為我返回對象,以及一個我已標記為的候選鍵:
[Column(IsPrimaryKey = true)]
public int EventId { get; set; }
一切都很好,可以將數據從Web服務加載回去,但是同時遍歷新的和更新的項目以將它們放入SQL CE數據庫中以充當緩存,如下所示:
foreach (var e in results)
{
var ev = (from evt in context.Events where evt.EventId == e.EventId select evt).FirstOrDefault();
if (ev == null)
{
// Brand new
context.Events.InsertOnSubmit(e);
}
else
{
// Update data
...
}
}
由於某種原因,它偶爾會認為一個事件是全新的,但是在InsertOnSubmit
期間會引發異常:
未處理System.InvalidOperationException
無法添加已經存在的實體。
我已使用Windows Phone Power Tools將數據庫從仿真器中拉出,並在Visual Studio中加載了數據庫,並且主鍵似乎沒有任何沖突的值,所以為什么我得到一個異常提示,發生沖突,並且調試器顯示沒有任何跨線程問題?
編輯
我發現的一件事是,我的實體具有一個覆蓋的Equals()
,該Equals()
不覆蓋主鍵(它對自然鍵進行了比較),並且該Web服務似乎在某個東西上記錄了兩個記錄,記錄為候選密鑰。
如果我也調整Equals方法來解決主鍵問題,則該異常更改為SqlCeException
,它告訴我:
重復值不能插入唯一索引。 [表名稱= SpecialEvent,約束名稱= PK_SpecialEvent]
即使主鍵仍然沒有被復制,這也讓我更加困惑(特別是因為這種類型的異常不容易被捕獲)
EDIT2
我什至嘗試在執行更新的代碼周圍使用lock() {}
,但是我仍然遇到奇怪的沖突,所以我很困惑為什么偶爾會遇到沖突,尤其是當SDF無法反映沖突時。同樣的沖突。
就我而言,這IsVersion = true
兩個因素-我的實體沒有IsVersion = true
的屬性,也沒有UpdateCheck = UpdateCheck.Never
。鍵。 似乎存在計時問題,導致它僅在列與預期的舊值匹配時才嘗試嘗試更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.