[英]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();
我可以想象我可以通過兩種方式實現這一目標:
有沒有人曾經解決過這個問題,或者知道一個好方法來解決它?
我在審計變更方面做了類似的工作 - 這是第一步。 我的解決方案通過使我的設計器上下文抽象然后從中導出真實上下文並重寫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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.