【问题标题】:What is the best way to transparently log changes to objects when using LINQ-to-SQL?使用 LINQ-to-SQL 时透明记录对象更改的最佳方法是什么?
【发布时间】:2009-12-16 13:20:44
【问题描述】:

我会跟踪对对象所做的所有更改,以便用户可以查看回滚到任何项目的任何先前版本在数据库中。

history 数据库表如下所示:

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();

我可以想象我可以通过两种方式来实现这一点:

  1. 覆盖 db.SubmitChanges() 但问题是如何访问正在等待更改的对象。
  2. 将我的日志记录方法附加到 OnSubmitChanges 事件,但我还没有找到解决方案

有没有人解决过这个问题或知道解决这个问题的好方法?

【问题讨论】:

  • 你能连接到由 Linq 自动生成到 sql-metal 设计器或 Sql-metal 的 INotifyPropertyChanged 和 INotifyPropertyChanging 接口并围绕此进行跟踪吗?
  • 有什么理由不能使用数据库触发器?

标签: c# linq linq-to-sql change-tracking


【解决方案1】:

对于您的第一个问题,您可以使用 db.GetChangeSet() 访问等待更改的对象,并了解哪些字段已更改以及原始值是什么,您可以使用:

ITable table = db.GetTable(entity.GetType());
ModifiedMemberInfo[] modifiedMembers = table.GetModifiedMembers(entity);
object original = table.GetOriginalEntityState(entity);

【讨论】:

    【解决方案2】:

    我已经完成了一些similar work 审计更改——这是第一步。我的解决方案通过使我的设计器上下文抽象,然后从中派生真实上下文并覆盖 SubmitChanges 来工作。它与一个单独的审计上下文和一个可以获取对象并从中构造审计对象的助手类结合使用。它依赖于属性来提供关于哪个类是特定对象的审计类的必要信息。

    您可以在我的博客http://farm-fresh-code.blogspot.com 上找到更多信息。太复杂了,这里就不重复了。

    【讨论】:

      【解决方案3】:

      由于 L2S 为您生成代码,并且您希望更改生成代码的行为,我看到了两种可能性:

      1. 您开始使用 T4 模板从 dbml 文件生成代码并更改模板以添加您的功能。这个方法描述here
      2. 您可以通过自己编写部分类将功能添加到生成的(部分)数据上下文类中。在您的部分类中,您可以实现创建/更新/删除方法(CreateCustomer、UpdateCustomer 和 DeleteCustomer),添加存储更改的功能。

      我希望这些建议可以帮助你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        • 2010-10-14
        • 2020-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多