在SubmitOperation失败时保持DomainContext最新

本文关键字:DomainContext 最新 SubmitOperation 失败 | 更新日期: 2023-09-27 18:10:28

Background: Silverlight 4 - RIA - Entity Framework 4

描述:我有一些删除代码,我这样做:

db.Items.Remove(selectedItem);
db.SubmitChanges(deleteItemOperationCompleted, null);

这里条目从域上下文中删除,然后服务尝试在EF上执行操作(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);
    }
}

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

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

问题:在提交失败的情况下,"回滚"操作的正确方法(最佳实践)是什么?我唯一能想到的是创建另一个域上下文并再次加载数据,但由于加载的数据量,我希望避免这样做。是否可以将上下文返回到以前的状态或取消挂起的更改?如何解决这个问题?

在SubmitOperation失败时保持DomainContext最新

在您的情况下,您应该调用DomainContext上的RejectChanges来取消条目的删除,并将其EntityState更改回Unmodified。

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