如何拒絕Linq to SQL的DataContext中的所有更改?



Answers

為什麼不丟棄數據上下文並簡單地用新實例替換它?

Question

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

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

這可能嗎?




我的應用程序是outlook樣式,帶有一個圖標來選擇一個活動表單(ListBox)。 在允許用戶更改其上下文之前,他們必須接受更改或丟棄它們。

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所說,只需刪除數據上下文。

您可能不應該長時間保持數據上下文存活。 它們被設計為以事務方式使用(即每個原子工作單元一個數據上下文)。 如果長時間保持數據上下文存活,則在更新陳舊實體時會產生更大的生成並發異常的風險。




我是這樣做的。 我只是按照上面的Teddy的例子進行了簡化。 我有一個問題,為什麼甚至打擾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;
  }



刷新將起作用,但您必須為要重置的實體提供。

例如

dataContext.Refresh(RefreshMode.OverwriteCurrentValues, someObject);



Links