2012-04-10 58 views
3

使用LINQ-to-SQL時,可以通過調用DataContext.GetChangeSet()來獲取一組將更新,插入或刪除的對象數組。如果存在衝突,則DataContext.ChangeConflicts屬性將爲您提供對原始對象和已更改對象的引用。如果沒有衝突,是否有辦法訪問原始和已更改的對象?在LINQ-to-SQL變更集中獲取對象的原始副本

這需要對不執行INotifyPropertyChanging/INotifyPropertyChanged實體合作。

回答

0

我沒能找到一種方法,通過公共API來做到這一點。但是,如果你願意反思一下(最好是some compiled expressions to invoke any methods, constructors, and get accessors),就有可能獲得數據。

這裏就是你需要做的:

  1. 得到一個關於你DataContext實例的私有services領域。
  2. 創建的System.Data.Linq.ChangeProcessor一個實例。這是您撥打DataContext.GetChangeset()時實際使用的內部類。通過在從步驟1中的參考services,以及到DataContext實例的引用。
  3. 針對您的ChangeProcessor實例調用私有和無參數GetOrderedList方法。這會給你一個List<TrackedObject>。不幸的是,因爲TrackedObject也是一個內部類,所以您還需要使用反射來訪問它的屬性。
  4. 我們要找的對象是在TrackedObject實例的CurrentOriginal性能。它還有其他一些有用的屬性,例如IsNew,IsModifiedIsDeleted,這些都是不言自明的,以及IsInteresting,我假設這三個屬性都是真實的。

當然,因爲這些都是內部API,所以在框架更新時它們可能會發生變化,所以在使用此邏輯時請記住這一點。

3
var db = new DataContext(); 
db.GetChangeSet().Updates.ForEach(o => { 
    var currentObject = o; 
    var originalObject = db.GetTable(o.GetType()).GetOriginalEntityState(o); 
    var changedProperties = db.GetTable(o.GetType()).GetModifiedMembers(o); 
}); 
相關問題