我有一个为我返回对象的 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 没有反映相同的冲突时。