当数据库似乎没有冲突时,为啥 LINQ to SQL 会在 Windows Phone 上报告冲突?

Posted

技术标签:

【中文标题】当数据库似乎没有冲突时,为啥 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?当数据库似乎没有冲突时,为什么 LINQ to SQL 会在 Windows Phone 上报告冲突? 【发布时间】:2012-06-03 17:39:51 【问题描述】:

我有一个 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(),它没有覆盖主键(它对自然键进行了比较),并且看起来 Web 服务有两条记录被记录为候选键。

如果我也调整 Equals 方法以考虑主键,则异常更改为 SqlCeException,它告诉我:

不能将重复值插入唯一索引。 [表名=SpecialEvent,约束名=PK_SpecialEvent]

即使主键仍然没有被复制,这让我更加困惑(特别是因为这种类型的异常不容易被捕获)

EDIT2

我什至尝试在执行更新的代码周围使用lock() ,但我仍然遇到奇怪的冲突,所以我很困惑为什么我偶尔会遇到冲突,尤其是当 SDF 没有反映时同样的冲突。

【问题讨论】:

您的results 中的事件是唯一的吗?可能是那里有一个重复的事件并且您正在插入两者(因为它们在数据库中还不存在)。然后,当您尝试提交更改时,您会得到一个新的异常。 @JeffMercado 问题是,我正在检查它发生之前,这是“奇怪的” 【参考方案1】:

在我的情况下,事实证明这归结为几个因素的结合——我的实体没有IsVersion = true 的属性,也没有UpdateCheck = UpdateCheck.Never 在不构成我的一部分的列上首要的关键。似乎存在时间问题,导致它仅在列与预期的旧值匹配时才尝试更新。

【讨论】:

以上是关于当数据库似乎没有冲突时,为啥 LINQ to SQL 会在 Windows Phone 上报告冲突?的主要内容,如果未能解决你的问题,请参考以下文章