背景: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);
}
}
摄制: 我尝试删除该项(由于数据库中的参照完整性约束,不能删除该项)。我收到错误发生的消息。没关系。当我然后尝试删除一些其他项目(通过外键与任何其他实体无关)时,我收到相同的消息,即使该项目可以从数据库中删除。
问题是我从域上下文中删除了第一个项目(即使它没有从数据库中删除)。因此,当我尝试删除第二个项目时,它也会从上下文中删除。提交更改时,可以从数据库中删除最后一项,但问题是为整个上下文提交了更改,因为在第一步中我删除了无法从数据库中删除的项,提交操作失败。
问题:在提交失败的情况下,“回滚”操作的正确方法(最佳做法)是什么?我能想到的唯一想法是创建另一个域上下文并再次加载数据,但我想避免这种情况,因为加载了大量数据。可以将上下文返回到某个先前的状态或取消挂起的更改吗?如何解决这个问题?
答案 0 :(得分:2)
在您的情况下,您应该在您的DomainContext上调用RejectChanges取消删除该项目并将其EntityState更改回未修改。
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);
db.RejectChanges(); // call reject changes on the DomainContext
}
}