使用LINQ-to-SQL時,可以通過調用DataContext.GetChangeSet()
來獲取一組將更新,插入或刪除的對象數組。如果存在衝突,則DataContext.ChangeConflicts
屬性將爲您提供對原始對象和已更改對象的引用。如果沒有衝突,是否有辦法訪問原始和已更改的對象?在LINQ-to-SQL變更集中獲取對象的原始副本
這需要對不執行INotifyPropertyChanging
/INotifyPropertyChanged
實體合作。
使用LINQ-to-SQL時,可以通過調用DataContext.GetChangeSet()
來獲取一組將更新,插入或刪除的對象數組。如果存在衝突,則DataContext.ChangeConflicts
屬性將爲您提供對原始對象和已更改對象的引用。如果沒有衝突,是否有辦法訪問原始和已更改的對象?在LINQ-to-SQL變更集中獲取對象的原始副本
這需要對不執行INotifyPropertyChanging
/INotifyPropertyChanged
實體合作。
我沒能找到一種方法,通過公共API來做到這一點。但是,如果你願意反思一下(最好是some compiled expressions to invoke any methods, constructors, and get accessors),就有可能獲得數據。
這裏就是你需要做的:
DataContext
實例的私有services
領域。System.Data.Linq.ChangeProcessor
一個實例。這是您撥打DataContext.GetChangeset()
時實際使用的內部類。通過在從步驟1中的參考services
,以及到DataContext
實例的引用。ChangeProcessor
實例調用私有和無參數GetOrderedList
方法。這會給你一個List<TrackedObject>
。不幸的是,因爲TrackedObject
也是一個內部類,所以您還需要使用反射來訪問它的屬性。TrackedObject
實例的Current
和Original
性能。它還有其他一些有用的屬性,例如IsNew
,IsModified
和IsDeleted
,這些都是不言自明的,以及IsInteresting
,我假設這三個屬性都是真實的。當然,因爲這些都是內部API,所以在框架更新時它們可能會發生變化,所以在使用此邏輯時請記住這一點。
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);
});