簡體   English   中英

使用LINQ-to-SQL時,透明地記錄對象更改的最佳方法是什么?

[英]What is the best way to transparently log changes to objects when using LINQ-to-SQL?

我會跟蹤對對象所做的所有更改 ,以便用戶可以查看回滾到數據庫中任何項目的任何先前版本。

歷史數據庫表如下所示:

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事件,但我還沒有找到解決方案

有沒有人曾經解決過這個問題,或者知道一個好方法來解決它?

我在審計變更方面做了類似的工作 - 這是第一步。 我的解決方案通過使我的設計器上下文抽象然后從中導出真實上下文並重寫SubmitChanges來工作。 它與一個單獨的審計上下文和一個輔助類一起工作,該類可以獲取一個對象並從中構造審計對象。 它依賴於屬性來提供有關哪個類是特定對象的審計類的必要信息。

您可以在我的博客上找到更多信息, 網址http://farm-fresh-code.blogspot.com 在這里重復過於復雜。

對於第一個問題,您可以訪問等待使用db.GetChangeSet()更改的對象,並了解哪些字段已更改以及原始值是什么,您可以使用:

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

由於L2S為您生成代碼,並且您希望改變生成的代碼的行為,我看到兩種可能性:

  1. 您開始使用T4模板從dbml文件生成代碼並更改模板以添加您的功能。 這里描述這種方法
  2. 您可以通過自己編寫部分類來將功能添加到生成的(部分)datacontext類中。 在您的分部類中,您可以實現創建/更新/刪除方法(CreateCustomer,UpdateCustomer和DeleteCustomer),添加存儲更改的功能。

我希望這些指針可以幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM