【发布时间】: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 问题是,我正在检查它发生之前,这是“奇怪的”
标签: c# linq-to-sql sql-server-ce windows-phone-7.1