在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

 

posted @ 2020-06-18 13:24  乔安生  阅读(1541)  评论(2编辑  收藏  举报