背景: Silverlight 4 - RIA - 实体框架 4
描述: 我有一些删除代码:
db.Items.Remove(selectedItem);
db.SubmitChanges(deleteItemOperationCompleted, null);
在这里,该项目从域上下文中删除,然后服务尝试在 EF 上执行操作(进而在 DB 上执行操作)。
回调方法:
private void deleteOperationCompletedM(SubmitOperation op)
{
if (op.Error == null)
{
MessageBox.Show("Delete operation was successfull.");
// Some other code here (removed for brevity)
}
else
{
op.MarkErrorAsHandled();
MessageBox.Show("An error has occured." + op.Error.Message);
}
}
Repro: 我尝试删除该项目(由于数据库中的参照完整性约束,无法删除该项目)。我收到发生错误的消息。没关系。然后,当我尝试删除其他一些项目(与任何其他实体的外键无关)时,我收到相同的消息,即使可以从数据库中删除该项目。
问题是我已经从域上下文中删除了第一项(即使它没有从数据库中删除)。因此,当我尝试删除第二个项目时,它也会从上下文中删除。提交更改时,可以从数据库中删除最后一项,但问题是针对整个上下文提交了更改,并且由于在第一步中我删除了一个无法从数据库中删除的项目,提交操作失败。
问题:在提交失败的情况下“回滚”操作的正确方法(最佳实践)是什么?我能想到的唯一想法是创建另一个域上下文并再次加载数据,但我想避免这种情况,因为加载的数据量很大。上下文是否可以返回到以前的某个状态或取消挂起的更改?如何解决这个问题?