Skip to content
FreeSql 官方文档FreeSql 官方文档
指南
扩展
服务支持
github icon
    • 基于FreeSql扩展
      • 多个 IFreeSql实例,如何注入使用
        • 技巧:ISelect 如何拷贝(copy)复用,克隆(clone)
          • Docker+ FreeSql
            • FreeSql 如何实现审计日志
              • 1、fsql.Aop.CrudAfter 事件是 CRUD 之后触发,提供以下参数
                • 2、FreeSql.DbContext 或者 FreeSql.UnitOfWork 提供对象变化跟踪
                • Mysql 5.5 兼容性
                  • In多列查询,表达式自定义实现
                    • 技巧:自定义解析表达式树,实现动态聚合列 sum(case when ...)

                    FreeSql 如何实现审计日志

                    author iconnicyecalendar icon2022年6月25日timer icon大约 2 分钟word icon约 520 字

                    此页内容
                    • 1、fsql.Aop.CrudAfter 事件是 CRUD 之后触发,提供以下参数
                    • 2、FreeSql.DbContext 或者 FreeSql.UnitOfWork 提供对象变化跟踪

                    # FreeSql 如何实现审计日志

                    有两种情况,如果都是针对实体操作,确实很好做这个功能。

                    IFreeSql 更新/删除,都可以不传实体进行操作,所以这个 old_values, new_values 实现起来比较麻烦(可能需要查询一次?性能?)。另外还有批量操作。

                    # 1、fsql.Aop.CrudAfter 事件是 CRUD 之后触发,提供以下参数

                    /// <summary>
                    /// 标识符,可将 CurdBefore 与 CurdAfter 进行匹配
                    /// </summary>
                    public Guid Identifier { get; protected set; }
                    protected Stopwatch Stopwatch { get; }
                    /// <summary>
                    /// 操作类型
                    /// </summary>
                    public CurdType CurdType { get; } //Select, Delete, Update, Insert, InsertOrUpdate
                    /// <summary>
                    /// 实体类型
                    /// </summary>
                    public Type EntityType { get; }
                    /// <summary>
                    /// 实体类型的元数据
                    /// </summary>
                    public TableInfo Table { get; }
                    /// <summary>
                    /// 执行的 SQL
                    /// </summary>
                    public string Sql { get; }
                    /// <summary>
                    /// 参数化命令
                    /// </summary>
                    public DbParameter[] DbParms { get; }
                    
                    /// <summary>
                    /// 发生的错误
                    /// </summary>
                    public Exception Exception { get; }
                    /// <summary>
                    /// 执行SQL命令,返回的结果
                    /// </summary>
                    public object ExecuteResult { get; }
                    /// <summary>
                    /// 耗时(单位:Ticks)
                    /// </summary>
                    public long ElapsedTicks => this.Stopwatch.ElapsedTicks;
                    /// <summary>
                    /// 耗时(单位:毫秒)
                    /// </summary>
                    public long ElapsedMilliseconds => this.Stopwatch.ElapsedMilliseconds;
                    
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    11
                    12
                    13
                    14
                    15
                    16
                    17
                    18
                    19
                    20
                    21
                    22
                    23
                    24
                    25
                    26
                    27
                    28
                    29
                    30
                    31
                    32
                    33
                    34
                    35
                    36
                    37
                    38
                    39
                    40
                    41
                    42

                    # 2、FreeSql.DbContext 或者 FreeSql.UnitOfWork 提供对象变化跟踪

                    全局设置:

                    fsql.SetDbContextOptions(opt => {
                      opt.OnEntityChange = report => {
                        Console.WriteLine(report);
                      };
                    });
                    
                    1
                    2
                    3
                    4
                    5

                    单独设置 DbContext 或者 UnitOfWork:

                    var ctx = fsql.CreateDbContext();
                    ctx.Options.OnEntityChange = report => {
                      Console.WriteLine(report);
                    };
                    
                    var uow = fsql.CreateUnitOfWork();
                    uow.OnEntityChange = report => {
                      Console.WriteLine(report);
                    };
                    
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9

                    参数 report 是一个 List 集合,集合元素的类型定义如下:

                    public class ChangeInfo
                    {
                        public object Object { get; set; }
                        public EntityChangeType Type { get; set; }
                        /// <summary>
                        /// Type = Update 的时候,获取更新之前的对象
                        /// </summary>
                        public object BeforeObject { get; set; }
                        /// <summary>
                        /// 实体类型
                        /// </summary>
                        public Type EntityType { get; set; }
                    }
                    public enum EntityChangeType { Insert, Update, Delete, SqlRaw }
                    
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    11
                    12
                    13
                    14
                    变化类型说明
                    Insert实体对象被插入
                    Update实体对象被更新
                    Delete实体对象被删除
                    SqlRaw执行了SQL语句

                    SqlRaw 目前有两处地方比较特殊:

                    • 多对多联级更新导航属性的时候,对中间表的全部删除操作;
                    • 通用仓储类 BaseRepository 有一个 Delete 方法,参数为表达式,而并非实体;
                    int Delete(Expression<Func<TEntity, bool>> predicate);
                    
                    1

                    DbContext.SaveChanges,或者 Repository 对实体的 Insert/Update/Delete,或者 UnitOfWork.Commit 操作都会最多触发一次该事件。

                    • 可根据 EntityType 获取具体的表名,数据库信息
                    //获取实体类核心配置
                    TableInfo  tableInfo=fsql.CodeFrist.GetTableByEntity(Type entityType);
                    DbInfoResult  dbinfoResult=fsql.CodeFrist.GetDbInfo(Type entityType);
                    
                    1
                    2
                    3
                    edit icon在 GitHub 上编辑此页open in new window
                    上次编辑于: 2022/6/29 下午10:18:15
                    贡献者: igeekfan
                    上一页
                    Docker+ FreeSql
                    下一页
                    Mysql 5.5 兼容性
                    Copyright © 2018-present nicye
                    Copyright © 2022 nicye

                    该应用可以安装在你的 PC 或移动设备上。这将使该 Web 应用程序外观和行为与其他应用程序相同。它将在出现在应用程序列表中,并可以固定到主屏幕,开始菜单或任务栏。此 Web 应用程序还将能够与其他应用程序和你的操作系统安全地进行交互。

                    详情