簡體   English   中英

當數據庫似乎沒有數據庫時,為什么LINQ to SQL在Windows Phone上報告沖突?

[英]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.

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