当数据库似乎没有冲突时,为啥 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 上报告冲突?的主要内容,如果未能解决你的问题,请参考以下文章

LINQ 中的数据冲突

为啥 linq to object 手动实现迭代器?

为啥,当我在 WCF 服务中模拟时,当我尝试运行 LINQ to SQL 查询时,我的服务不能加载 System.Transactions?

LINQ to SQL语句(13)之开放式并发控制和事务

使用 TPH 和复杂类型时 LINQ to Entities 的初始性能问题,Pregen 视图似乎啥都不做?

LINQ to SQL class LINQ to sql Objects?