当数据库似乎没有冲突时,为啥 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 上报告冲突?的主要内容,如果未能解决你的问题,请参考以下文章
为啥,当我在 WCF 服务中模拟时,当我尝试运行 LINQ to SQL 查询时,我的服务不能加载 System.Transactions?