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();
我可以想象我可以通过两种方式来实现这一点:

  • 覆盖db.SubmitChanges()但问题是如何访问等待更改的对象
  • 将我的日志记录方法附加到OnSubmitChanges事件,但我尚未找到解决方案
  • 有没有人处理过这个问题,或者知道解决这个问题的好方法?我已经做了一些关于审核更改的工作,这是第一步。我的解决方案的工作原理是使设计器上下文抽象,然后从中派生出真正的上下文并覆盖SubmitChanges。它与一个单独的审计上下文和一个可以获取对象并从中构造审计对象的助手类一起工作。它依赖于属性来提供关于哪个类是特定对象的审核类的必要信息


    你可以在我的博客上找到更多信息。因为L2S为您生成代码,并且您希望更改生成代码的行为,所以我认为有两种可能性:

  • 开始使用T4模板从dbml文件生成代码,并更改模板以添加功能。描述了该方法
  • 通过自己编写一个分部类,可以将功能添加到生成的(分部)datacontext类中。在分部类中,可以实现create/update/delete方法(CreateCustomer、UpdateCustomer和DeleteCustomer),添加存储更改的功能

  • 我希望这些指针可以帮助您解决问题。

    对于第一个问题,您可以使用
    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接口,并围绕这一点构建跟踪?是否有任何原因不能使用数据库触发器?