2011-10-06 103 views
2

背景: Silverlight 4中 - 俄 - 实体框架4上SubmitOperation失败保持DomainContext最新

说明: 我有一些缺失的代码中,我做的事:

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

这里该项目将从域上下文中删除,然后服务尝试在EF上执行操作(然后执行对数据库的操作)。

回调方法:

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

摄制: 我试图删除的项目(不能因为在数据库中的引用完整性约束被删除)。我收到错误发生的消息。没关系。当我尝试删除某个其他项目(与外键无关的任何其他实体)时,我会收到相同的消息,即使此项目可从数据库中删除。

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

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

回答

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