2011-10-06 70 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 
    } 
}