在EntityFrameworkCore中記錄EF修改日志,保存,修改字段的原始值,當前值,表名等信息


突發奇想,想把業務修改的所有字段原始值和修改后的值,做一個記錄,然后發現使用EF可以非常簡單的實現這個功能

 

覆蓋父類中的 SaveShanges() 方法

        public new int SaveChanges()
        {
            //是否記錄EF變更日志
            bool efLogFlag = true;
            if (efLogFlag)
            {
                WriteEFDataLog();
            }

            return base.SaveChanges();
        }

獲取到EF 數據庫上下文中所有的變更條目

因為是測試Demo所以之記錄了 Update 操作日志

        /// <summary>
        /// EF變更日志
        /// </summary>
        private void WriteEFDataLog()
        {
            //獲取到EF變更條目
            var list = this.ChangeTracker.Entries();
            foreach (var item in list)
            {
                //對應的表名
                string tableName = "";

                #region 獲取表名
                Type type = item.Entity.GetType();
                Type patientMngAttrType = typeof(TableAttribute);
                TableAttribute attribute = null;
                if (type.IsDefined(patientMngAttrType, true))
                {
                    attribute = type.GetCustomAttributes(patientMngAttrType, true).FirstOrDefault() as TableAttribute;
                    if (attribute != null)
                    {
                        tableName = attribute.Name;
                    }
                }

                if (string.IsNullOrEmpty(tableName))
                {
                    tableName = type.Name;
                }
                #endregion

                switch (item.State)
                {
                    case EntityState.Detached:

                        break;
                    case EntityState.Unchanged:

                        break;
                    case EntityState.Deleted:

                        break;
                    case EntityState.Modified:
                        WriteEFUpdateLog(item, tableName);
                        break;
                    case EntityState.Added:

                        break;
                }
            }
        }

然后獲取到修改字段的原始值,和當前值,組裝成自己想要的格式,保存到自定義的地方。

        /// <summary>
        /// 記錄EF修改操作日志
        /// </summary>
        /// <param name="entry"></param>
        /// <param name="tableName"></param>
        private void WriteEFUpdateLog(EntityEntry entry, string tableName)
        {
            var propertyList = entry.CurrentValues.Properties.Where(i => entry.Property(i.Name).IsModified);

            PropertyEntry keyEntity = entry.Property("KeyId");
            foreach (var prop in propertyList)
            {
                PropertyEntry entity = entry.Property(prop.Name);
                string log = $"用戶:{ userName },對表:{ tableName } 進行了修改,原始值:{ entity.OriginalValue },當前值:{  entity.CurrentValue }, 唯一標識:{ keyEntity.CurrentValue }";
                WriteLog(log, EntityState.Modified);
            }
        }

 

因為是Demo的原因就直接記錄到了txt里面

        private void WriteLog(string log, EntityState state)
        {
            string logPath = AppContext.BaseDirectory + "EFLog.txt";
            FileStreamHelper.AppendAllLineText(logPath, $"{ state }: 創建時間:{ DateTime.Now } 日志內容: { log }");
        }
    public class FileStreamHelper
    {
        /// <summary>
        /// 向文件的末尾添加文本內容
        /// </summary>
        /// <param name="path"></param>
        /// <param name="textContent"></param>
        public static void AppendAllText(string path, string textContent)
        {
            File.AppendAllText(path, textContent);
        }

        /// <summary>
        /// 另起一行在把文本內容追加到后面
        /// </summary>
        /// <param name="path"></param>
        /// <param name="textContent"></param>
        public static void AppendAllLineText(string path, string textContent)
        {
            File.AppendAllText(path, $" \t\n{ textContent }");
        }
    }

輸出:

Modified: 創建時間:2020/6/18 12:59:22 日志內容: 用戶:喬安生,對表:Users 進行了修改,原始值:3,當前值:4, 唯一標識:124e388b-1efb-4a62-b894-0c9aa86524d5
Modified: 創建時間:2020/6/18 12:59:22 日志內容: 用戶:喬安生,對表:Users 進行了修改,原始值:3,當前值:4, 唯一標識:00bc43f8-f8ed-48f0-ba38-bc7121d8b87e
Modified: 創建時間:2020/6/18 12:59:22 日志內容: 用戶:喬安生,對表:Users 進行了修改,原始值:3,當前值:4, 唯一標識:94f1986b-2f05-464b-a671-17de4b6a3547
Modified: 創建時間:2020/6/18 12:59:22 日志內容: 用戶:喬安生,對表:Users 進行了修改,原始值:3,當前值:4, 唯一標識:cf5c2152-3bc7-411f-97e1-6ed6883b77fd
Modified: 創建時間:2020/6/18 12:59:22 日志內容: 用戶:喬安生,對表:Users 進行了修改,原始值:3,當前值:4, 唯一標識:a9e58f1d-5ac0-411b-88fd-2636241e810c
Modified: 創建時間:2020/6/18 12:59:22 日志內容: 用戶:喬安生,對表:Users 進行了修改,原始值:3,當前值:4, 唯一標識:2446c584-8008-4f82-9b1f-b873f6ffad7e
Modified: 創建時間:2020/6/18 12:59:22 日志內容: 用戶:喬安生,對表:Users 進行了修改,原始值:3,當前值:4, 唯一標識:457767ff-6979-4a61-a53b-1dcbae837c59
Modified: 創建時間:2020/6/18 12:59:22 日志內容: 用戶:喬安生,對表:Users 進行了修改,原始值:3,當前值:4, 唯一標識:fca224d6-35f6-4d31-9284-41e783ea91ba
Modified: 創建時間:2020/6/18 12:59:22 日志內容: 用戶:喬安生,對表:Users 進行了修改,原始值:3,當前值:4, 唯一標識:256e72ee-2bdd-4ebd-a4a1-c70da4c85a23
Modified: 創建時間:2020/6/18 12:59:22 日志內容: 用戶:喬安生,對表:Users 進行了修改,原始值:3,當前值:4, 唯一標識:27706c42-ccbd-440c-a0ce-e83dfc1ed988
Modified: 創建時間:2020/6/18 12:59:22 日志內容: 用戶:喬安生,對表:Users 進行了修改,原始值:2,當前值:3, 唯一標識:a1f2fcca-9cd8-43fa-964e-0786706fae6b
Modified: 創建時間:2020/6/18 12:59:22 日志內容: 用戶:喬安生,對表:Users 進行了修改,原始值:2,當前值:3, 唯一標識:bae8b72e-b5c1-4e7b-98bd-731a9c6d1ab0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM