我正在尝试实现乐观并发,
while (true) {
var e = db.MyTable.FirstOrDefault();
try {
// make changes to e
db.SaveChanges();
return;
} catch (DBConcurrencyException ex) {
db.Entry(e).Reload();
if (e == null) return; // <=== this can't be right?!
}
}
如果在我对e进行更改时,另一个作业会从数据库中删除该行,会发生什么。会发生什么? SaveChanges会成功吗?
或者,如果在重新加载之前,另一个作业会删除该行?在这种情况下,Reload会将e设置为null吗?或者Reload会抛出异常?我擦洗了文档,但找不到任何提示。
答案 0 :(得分:2)
SaveChanges
无法成功 - 行不再在此处,因此无需更新。如果成功,你的意思是它将默默地继续,然后也不会 - 它将抛出DbUpdateConcurrencyException
(注意,不 DBConcurrencyException
你在你的例子中捕获。)
如果您Reload
已删除实体,则其状态为Detached
(db.Entry(e).State
)。方法调用无法将e
变量设置为null,即使原则上也是如此 - 它不会被ref
传递。