C# 使用LINQtoSQL时,透明地记录对象更改的最佳方法是什么?
我跟踪对对象所做的所有更改,以便用户可以查看和回滚到数据库中任何项目的任何早期版本 历史记录数据库表如下所示:C# 使用LINQtoSQL时,透明地记录对象更改的最佳方法是什么?,c#,linq,linq-to-sql,change-tracking,C#,Linq,Linq To Sql,Change Tracking,我跟踪对对象所做的所有更改,以便用户可以查看和回滚到数据库中任何项目的任何早期版本 历史记录数据库表如下所示: Item | ItemId | Field | WhenChanged | OldValue | NewValue customer | 6 | LastName | 2009-12-31 13:00:04 | Sanders | Sanders-Smith customer | 5 | FirstName | 2009-12-3
Item | ItemId | Field | WhenChanged | OldValue | NewValue
customer | 6 | LastName | 2009-12-31 13:00:04 | Sanders | Sanders-Smith
customer | 5 | FirstName | 2009-12-31 12:11:14 | Jym | Jim
目前,每当用户填写表单时,我都会记录这些更改,因此我有对象新旧状态的完整信息
但是,现在我需要从代码中提供此历史数据记录。当使用LINQ to SQL时,它需要透明地工作,即开发人员不必做任何额外的工作,即以下代码也应导致写入历史记录表:
using (var db = Datasource.GetContext())
{
var customers = from c in db.Customers
where c.Status == "waiting"
select c;
foreach(var customer in customers)
{
customer.Status = "finished";
}
}
db.SubmitChanges();
我可以想象我可以通过两种方式来实现这一点:
你可以在我的博客上找到更多信息。因为L2S为您生成代码,并且您希望更改生成代码的行为,所以我认为有两种可能性:
我希望这些指针可以帮助您解决问题。对于第一个问题,您可以使用
db.GetChangeSet()
访问等待更改的对象,并了解哪些字段已更改以及原始值是什么,您可以使用:
ITable table = db.GetTable(entity.GetType());
ModifiedMemberInfo[] modifiedMembers = table.GetModifiedMembers(entity);
object original = table.GetOriginalEntityState(entity);
您能否连接到由Linq到sql metal designer或sql metal自动生成的INotifyPropertyChanged和INotifyPropertyChanged接口,并围绕这一点构建跟踪?是否有任何原因不能使用数据库触发器?