我怎樣才能拒絕Linq到SQL的DataContext中的所有更改?


Answers

為什麼不放棄數據上下文,並簡單地將其替換為新的實例?

Question

在Linq到SQL的DataContext上,我可以調用SubmitChanges()來提交所有更改。

我想要的是以某種方式拒絕datacontext中的所有更改,並回滾所有更改(最好不去數據庫)。

這可能嗎?




刷新將工作,但是你必須給你想要重置的實體。

例如

dataContext.Refresh(RefreshMode.OverwriteCurrentValues, someObject);



這是我如何做到的。 我只是跟著泰迪的例子,簡化了它。 我有一個問題,為什麼還要在DELETES刷新呢?

  public static bool UndoPendingChanges(this NtsSuiteDataContext dbContext)
  {
     if (dbContext.ChangesPending())
     {
        ChangeSet dbChangeSet = dbContext.GetChangeSet();

        dbContext.Refresh(RefreshMode.OverwriteCurrentValues, dbChangeSet.Deletes);
        dbContext.Refresh(RefreshMode.OverwriteCurrentValues, dbChangeSet.Updates);

        //Undo Inserts
        foreach (object objToInsert in dbChangeSet.Inserts)
        {
           dbContext.GetTable(objToInsert.GetType()).DeleteOnSubmit(objToInsert);
        }

        //Undo deletes
        foreach (object objToDelete in dbChangeSet.Deletes)
        {
           dbContext.GetTable(objToDelete.GetType()).InsertOnSubmit(objToDelete);
        }
     }

     return true;
  }



我的應用程序是Outlook風格的圖標來選擇一個活動的窗體(列錶框)。 在允許用戶改變他們的上下文之前,他們必須接受改變或丟棄它們。

var changes = db.GetChangeSet();
if ((changes.Updates.Count > 0) || (changes.Inserts.Count > 0) || (changes.Deletes.Count > 0))
{
    if (MessageBox.Show("Would you like to save changes?", "Save Changes", MessageBoxButton.YesNo)  == MessageBoxResult.Yes)
    {
        db.SubmitChanges();
    } else
    {
        //Rollback Changes
        foreach (object objToInsert in changes.Inserts)
        {
            db.GetTable(objToInsert.GetType()).DeleteOnSubmit(objToInsert);
        }
        foreach (object objToDelete in changes.Deletes)
        {
            db.GetTable(objToDelete.GetType()).InsertOnSubmit(objToDelete);
        }
        foreach (object objToUpdate in changes.Updates)
        {
            db.Refresh(RefreshMode.OverwriteCurrentValues, objToUpdate);
        }
        CurrentForm.SetObject(null); //Application Code to Clear active form
        RefreshList(); //Application Code to Refresh active list
    }
}



正如Haacked所說,只要放棄數據上下文。

您可能不應該保持長時間的數據上下文。 它們被設計成以交易方式使用(即每個原子工作單元一個數據上下文)。 如果您長時間保持數據上下文處於活動狀態,那麼當您更新陳舊的實體時,運行產生並發異常的風險會更大。