在SubmitOperation失败时保持DomainContext最新

时间:2011-10-06 06:57:10

标签: c# silverlight-4.0 wcf-ria-services rollback domaincontext

背景: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);
    }
}

摄制: 我尝试删除该项(由于数据库中的参照完整性约束,不能删除该项)。我收到错误发生的消息。没关系。当我然后尝试删除一些其他项目(通过外键与任何其他实体无关)时,我收到相同的消息,即使该项目可以从数据库中删除。

问题是我从域上下文中删除了第一个项目(即使它没有从数据库中删除)。因此,当我尝试删除第二个项目时,它也会从上下文中删除。提交更改时,可以从数据库中删除最后一项,但问题是为整个上下文提交了更改,因为在第一步中我删除了无法从数据库中删除的项,提交操作失败。

问题:在提交失败的情况下,“回滚”操作的正确方法(最佳做法)是什么?我能想到的唯一想法是创建另一个域上下文并再次加载数据,但我想避免这种情况,因为加载了大量数据。可以将上下文返回到某个先前的状态或取消挂起的更改吗?如何解决这个问题?

1 个答案:

答案 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
  }
}