2012-08-23 38 views
1

我正在EF中使用MVC3應用程序構建某種審計行爲,並且我嘗試了幾種方法,試圖避免對代碼造成嚴重影響,當然,還試圖避免儘可能多的額外代碼,因爲應用程序完成了35%的工作。審計EF沒有T4

Audit對象看起來像這樣:

  • AuditId
  • 用戶ID
  • OperationId
  • 的moduleId
  • 時間戳
  • 淨荷
  • <模塊>
  • <操作>
  • <用戶>

的想法去如下:

我創建了一個局部類隱藏SaveChanges()並覆蓋SaveChanges(SaveOptions)

然後我創建了兩個重載的同一個方法來接收我的實體作爲參數和/或不是SaveOptions枚舉參數。

除了明顯的新SaveChanges(),將我的Audit實體的屬性,但這裏的問題發生:我需要一個UserModuleOperation

我目前的解決方案來解決這個問題如下:

  • 我已經聲明在構造函數類水平的Audit對象。
  • 在控制器的構造函數中,我將User設置爲我的Audit對象。
  • 在每種方法中,我根據需要設置Operation
  • 在保存更改中,我處理來自ObjectStateManager的有效負載(在本例中爲xml)。

I'm very skeptic about this approach, it seems to be a little intrusive to my code. I've read lots of posts here in SO, but none of them helped me to improve this approach nor decide to change it. So please avoid linking things I've probably already read.

+0

審計最好在數據庫級別使用觸發器完成。 –

回答

2

另一種選擇是裝飾您希望與自定義屬性來審覈你的數據庫實體。在SaveChanges期間檢查屬性。對於模塊和操作字段,您可以在此時捕獲堆棧跟蹤 - 從中​​找到調用控制器和操作。這將有助於保持控制器清潔。

我在列級別執行審計,而不是obejct。通常我只關心幾列,而不關心整個事情。作爲參考,這裏是我的基地DbContext。我訂閱ObjectContext.SavingChanges事件,檢查標記爲已修改的所有內容,然後查找具有自定義[Audit]屬性的任何屬性。這可以很容易地擴展到還檢查刪除。