在使用實體框架(Entity Framework)的應用中加入審計信息(Audit trail)跟蹤數據的變動

来源:http://www.cnblogs.com/thinking-jiang/archive/2016/06/23/5610813.html
-Advertisement-
Play Games

在一些比較重要的業務系統中,通常會要求系統跟蹤數據記錄的變動情況。系統要記錄什麼時間,什麼人,對那些信息進行了變動。 比較簡單的實現方式是在每個表中加入兩個欄位CreatedBy和CreatedAt,見圖1。CreatedBy用來存是誰進行了這次更改。CreatedAt用來存什麼時間進行了這次更改。 ...


 

在一些比較重要的業務系統中,通常會要求系統跟蹤數據記錄的變動情況。系統要記錄什麼時間,什麼人,對那些信息進行了變動。

比較簡單的實現方式是在每個表中加入兩個欄位CreatedBy和CreatedAt,見圖1。CreatedBy用來存是誰進行了這次更改。CreatedAt用來存什麼時間進行了這次更改。但是這種方式只能保存最後一次進行改動的人和時間。中間的改動歷史都不能保留。改動前的值也不能保留。

                          圖 1

 

對於關鍵的信息系統,例如銀行系統,電商系統,公安系統,我們需要保存數據完整的變動信息和歷史。這通常包括進行變更的人,變更發生的時間,所有變更前的數據值,變更後的數據值。

在使用實體框架(Entity Framew)的應用中,可以很方便的實現加入審計信息(Audit trail)跟蹤數據的變動的功能。我們在這裡給大家做一個簡要的介紹。

0. 前提是你使用的實體框架是 code-first.

1. 使用Nuget安裝Tracker Enabled Dbcontext。如果你沒有使用Microsoft.AspNet.Identity;你可以安裝TrackerEnabledDbContext。如果你使用了Microsoft.AspNet.Identity;你需要安裝TrackerEnabledDbContext.Identity. 見圖2.

 

 

                  圖2

 

2. 修改你的DBcontext。如果你使用了Microsoft.AspNet.Identity。那麼你的DBContext要繼承TrackerIdentityContext<ApplicationUser>,否則你需要繼承TrackerContext。見圖3.

                圖 3

 

3. 修改你的數據層操作方法和業務層的方法。要增加userId的參數把userId的信息傳遞過來。見圖4.修改context.SaveChanges();為context.SaveChanges(userId); userId為更改用戶的Id信息。

 

            圖 4.

 

4. 更新資料庫。運行Enable-Migrations -Force。再更新資料庫運行 Update-Database。詳細步驟,如果不是很清楚,可以自行網上查詢。

更新完資料庫後,你會發現裡邊增加了兩個新表。一個是AuditLogs。另一個是AuditLogDetails。見 圖5.

    圖 5.

5. 我們做一個員工維護的Demo來驗證它的功能。在這個Demo中包括 “增加員工信息”和“更新員工信息”兩個功能。見圖6.

 

              圖 6.

新增加的員工是 10010。

更新的員工是1009。我們將他的employee code 從1006變成1009. Employee Name從周伯通1變成了周伯通。

 

6. 完成上述操作後。我們查看AuditLogs和AuditLogDetails表。裡邊已經增加了相關的變動信息。 見圖7和圖8.

  1) AuditLogs表

          圖 7

  2. AuditLogDetails表

 

7. 源代碼下載

  a) 源代碼下載

  b) 資料庫下載

謝謝大家。歡迎指正和討論!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 背水一戰 Windows 10 之 綁定: 與 Element 綁定, 與 Indexer 綁定, TargetNullValue - 當綁定數據為 null 時顯示的值, FallbackValue - 當綁定失敗時顯示的值 ...
  • EF和SqlHelper 簡單三層 EF生成sql,再調用ado.net訪問資料庫,最後使結果對象具體化. 之前的SqlHelper 簡單三層的寫法,拼接sql語句字元串,再調用ado.net訪問資料庫,最後也是把結果轉換為對象. 明顯的區別:sql語句的產生,EF是SQL查詢命令和 LINQ 查詢 ...
  • 前言 老規矩,任何技術的入門我通常都會總結增刪改查,本文我就通過HttpWebRequest和SolrNet的方式實現Solr最基礎的增刪改查(CURD)。對於自己的完整項目,同時不想過於依賴第三方類庫的則通過Http介面的方式來調用Solr。 當然也有人喜歡調用第三方的類庫,簡單方便,不需要自己處 ...
  • C#本質論和CLR via C#兩本好書,周老師可能是俗務纏身,太忙了吧,翻譯得只能讓人呵呵了。 你要是忙,別接那麼多活好不啦。 現在都在說供給側改革,都在大力提倡工匠精神,我們做技術的,還是踏實點好,對不啦? 對照一下李建忠老師翻譯的那一版CLR via C#,差距啊。 這裡,僅把隨手發現的幾個問 ...
  • 首先,我們定義一個Student類來測試. 在這樣一個數據中. 我們發現,如果使用自帶的 Distinct ,發現得數據依然是一樣,並沒有想象中的去除重覆。 以下,給出幾個解決方案。 第一種: 繼承EqualityComparer 我們新建一個類。如下。且必須重寫父類中的抽象方法。Equals和Ge ...
  • 一、背景 這幾天在維護公司的一個項目,嗯…到現在七八年沒人動過了(也是老古董了),都說N年前的代碼碰不得 處處是坑 不能挖坑還得一步一步的填坑,恰好今天就填了一坑 此處作為記錄 供以後翻閱,對代碼除了有些看不懂或者說是很凌亂之外,其他都還行(沒註釋、有註釋的地方是自動生成的英文註釋…..、包含 各種 ...
  • 組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織 組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織 組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織 組織者組織組織者組織組織者組織組織者組織組織 ...
  • 本文只是基礎代碼片段,直接先寫 結論: C# DateTime 時間相減 —— 和 時區無關,只和時間值有關。 運行結果: 測試代碼: 於是 就有了 這樣的問題 (如下問題 僅作思考): > 最開始, 項目是 國內項目 —— 從不考慮時區, 統一用的 +8時間, 存入資料庫的 也是 +8時間. > ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...