0

我有一个为我返回对象的 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 方法以考虑主键,则异常更改为 aSqlCeException并告诉我:

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

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

编辑2

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

4

1 回答 1

0

就我而言,事实证明这取决于几个因素的结合——我的实体没有属性,IsVersion = trueUpdateCheck = UpdateCheck.Never没有不构成我主键一部分的列。似乎存在时间问题,导致它仅在列与预期的旧值匹配时才尝试更新。

于 2012-06-25T12:59:04.397 回答