首页 > 数据库 >记录实体操作日志--通过DbContext单次批量记录本次数据库操作中所有实体的更新情况

记录实体操作日志--通过DbContext单次批量记录本次数据库操作中所有实体的更新情况

时间:2023-01-13 10:01:03浏览次数:55  
标签:记录 -- 实体 修改 var entry property

一、先看需求

需求就是在我们的业务中存在查看修改日志的情况,比如:甲修改了乙的身份证号,丙想知道是谁修改了乙的信息,修改了哪些信息。

二、常规方案

在修改乙的信息的方法中记录一下(代码就不写了,常规记录日志的方法应该很简单),如果本次修改操作中仅更新了乙的信息这一个实体,那么只记录一次即可,但是如果在本次修改操作中还修改了n个其他的实体,那么我们就要再记录n次,还可能会有遗漏的情况。

三、通过DbContext的changgetracker来一次性记录本次操作中所有实体的修改情况

直接贴代码了,具体的说明在注释中

private void GenerateLogs(DbStoreBase dbStore)
{
    // 通过changgetracker即可找到本次操作中跟踪到的实体
    var list = dbStore.ChangeTracker.Entries();
    // 找出本次操作中所有修改过的实体
    var entryModifieds = list.Where(e => e.State == EntityState.Modified).ToList();
    var userId = loginUserEquipment.UserId;
    foreach (var entry in entryModifieds)
    {
        var entity = entry.Entity;
        // 找到本实体中的主键
        var primaryKeyName = entry.CurrentValues.Properties.Where(e => e.IsPrimaryKey()).FirstOrDefault()?.Name;
        if (primaryKeyName.IsNullOrEmpty())
        {
            continue;
        }
        var noteId = entry.Property(primaryKeyName)?.CurrentValue;
        var updateContexts = new List<EntityUpdateContext>();
        var properties = entry.CurrentValues.Properties.Where(i => entry.Property(i.Name).IsModified);
        foreach (var item in properties)
        {
            var property = entry.Property(item.Name);
            if (property == null)
            {
                continue;
            }
            // 找到更改过的字段  
            if (property.CurrentValue.ToStringEmpty() != property.OriginalValue.ToStringEmpty())
            {
                var customProperty = new CustomPropertyInfo(item.PropertyInfo);
                // EntityUpdateContext就是记录修改记录的一个类,只有下面这三个字段,为了便于记录
                updateContexts.Add(new EntityUpdateContext
                {
                    CustomPropertyInfo = customProperty,
                    OriginalValue = property.OriginalValue,
                    TargetValue = property.CurrentValue
                });
            }
        }
        if (updateContexts.Count == 0)
        {
            continue;
        }
        // 这是具体的记录方法 可以使用自己的
        histroyDataService.Update(userId, entity, noteId, updateContexts, true);
    }
}

  

标签:记录,--,实体,修改,var,entry,property
From: https://www.cnblogs.com/ttyycc/p/17048652.html

相关文章

  • 免费OA办公系统能够给企业带来什么价值
    如今随着移动互联网的发展,免费OA办公系统已然深入人心,以人和组织为基础的免费OA,建立高效协同的运营管理模式,提升管理能力,成为企业信息化建设的不二选择。第一,提高企业信息化......
  • 产品质量控制 记录
             ......
  • 分享一个强大的 Vue 图片编辑插件(快来试试!)
    本篇文章给大家分享一款强大到没朋友的Vue图片编辑插件,可以对图片进行旋转、缩放、裁剪、涂鸦、标注、添加文本等,快来试试并收藏吧!【相关推荐:《vue.js教程》】最近用户......
  • 5个实用JS库
    前言作为一名前端开发者,我通过这些JavaScript库大大提高了自己的效率,比如格式化日期、处理URL参数、调试手机网页等。因此,我想将这些好用的库分享给你们,也希望可以帮助到你......
  • 在Vue3+ElementPlus中,配置按需导入后,以服务的方式调用ElLoading,但页面中不显示
    Element-plus中使用Loading,样式丢失背景:Vue3+Element-Plus,使用了按需导入。import{ElLoading}from'element-plus';ElLoading.service({lock:true,text:'......
  • 水文监测站_自动水文监测设备
    水文监测站又称雷达水位监测站、自动水文监测设备,水文监测站是一款多功能、低功耗、适用恶劣应用环境的远程河流水文监测终端,适用于多种测量条件,不受风、温度、雾霾、泥沙、......
  • 小程序用户登录架构设计
      1.背景上一篇文章《小程序静默登录方案设计》提到过,小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。即......
  • Linux数据实时同步(sersync+rsync)
    一、Slave服务器配置1.在Slave服务器上安装Rsync[root@slave~]#rpm-ivhrsync-3.1.2-11.el7_9.x86_64.rpm###rpm自行下载2.在Slave服务器上配置rsync[root@slave......
  • Qualcomm messaging Interface(QMI)消息
    https://blog.csdn.net/huilin9960/article/details/80802560https://blog.csdn.net/alimingh/article/details/101383160 QMI概述QMI是高通提供的一种多处理器进程间......
  • fs模块读取文件内容
         ......