使用LINQ-to-SQL时,可以通过调用DataContext.GetChangeSet()
来获取一组将被更新,插入或删除的对象数组。如果存在冲突,DataContext.ChangeConflicts
属性将为您提供对原始对象和已更改对象的引用。如果没有冲突,有没有办法访问原始和更改的对象?
这需要适用于未实施INotifyPropertyChanging
/ INotifyPropertyChanged
的实体。
答案 0 :(得分: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);
});
答案 1 :(得分:0)
我无法通过公共API找到解决方法。但是,如果你愿意稍微反思一下(最好是some compiled expressions to invoke any methods, constructors, and get accessors),就可以获得数据。
以下是您需要做的事情:
services
实例的私有DataContext
字段的引用。System.Data.Linq.ChangeProcessor
的实例。这是一个在调用DataContext.GetChangeset()
时实际使用的内部类。传递对步骤1中services
的引用,以及对DataContext
实例的引用。GetOrderedList
实例调用私有且无参数的ChangeProcessor
方法。这将为您提供List<TrackedObject>
。不幸的是,由于TrackedObject
也是一个内部类,因此您还需要使用反射来访问其属性。Current
个实例的Original
和TrackedObject
属性中。它还有一些其他有用的属性,例如IsNew
,IsModified
和IsDeleted
,它们都是不言自明的,以及IsInteresting
,我假设代表前3个属性中的任何一个属实。当然,由于这些都是内部API,因此在框架更新时它们会发生变化,因此在使用此逻辑时请记住这一点。