突发奇想,想把业务修改的所有字段原始值和修改后的值,做一个记录,然后发现使用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, $" { 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