2012-03-06 35 views
2

我們需要在MVC 3項目中記錄特定的操作。數據庫表將存儲日誌是這樣的:審計/登錄ASP.NET MVC3

「用戶[SessionUserHere ...]更改[名稱] [] [OtherAttributesHere ...] [ChangedEmployeeHere值...]「

我需要了解模型的哪些屬性發生了變化,哪些屬性保留了原始值。 有什麼方法可以跟蹤模型的哪些屬性改變了?

MVC3 doing Audit trail中提出了數據庫觸發器;但是我們在這個項目中使用Sql Server Compact。

謝謝...

回答

1

你可以做代碼審覈,而不是數據庫。在HttpPost處理程序中,獲取原始值並使用審計函數比較對象。我有一個家庭釀造實施,但這也有類似的事情Compare .NET Objects

這意味着你可以做到以下幾點:

var original = GetDatabaseRecord(xx); 
var newRec = GetFormSubmission(); // However you do this 

var auditor = new CompareObjects(); 

if (auditor.Compare(original, newRec)) 
{ 
    foreach (var diff in auditor.Differences) 
    { 
     // work through the deltas 
    } 
} 
else 
{ 
    // Nothing changed! 
} 

我自己的版本返回的結構:

  • 名稱(如 「Issue.Priority」)
  • 變化(ChangedValue, OnlyLeft,OnlyRight)
  • 舊值
  • 新值

提供的鏈接可能足以滿足您的需求或充當起點。

1

我創建了一個庫來做到這一點,並提供了一些額外的元數據。它依靠MVC ModelMetadataDataAnnotations爲非技術用戶提供diff的「可讀版本」。

https://github.com/paultyng/ObjectDiff

考慮對象,如(沒有元數據要明顯):

var before = new 
{ 
    Property1 = "", 
    MultilineText = "abc\ndef\nghi", 
    ChildObject = new { ChildProperty = 7 }, 
    List = new string[] { "a", "b" } 
}; 

var after = new 
{ 
    Property1 = (string)null, 
    MultilineText = "123\n456", 
    NotPreviouslyExisting = "abc", 
    ChildObject = new { ChildProperty = 6 }, 
    List = new string[] { "b", "c" } 
}; 

這將輸出類似:

ChildObject - ChildProperty: '6', was '7' 
List - [2, added]: 'c', was not present 
List - [removed]: No value present, was 'a' 
MultilineText: 
----- 
123 
456 
----- 
was 
----- 
abc 
def 
ghi 
----- 
NotPreviouslyExisting: 'abc', was not present 
+0

這是否有什麼樣的翻譯支持還是我分叉代碼並修改它? – 2014-09-13 10:32:44