【问题标题】:What is the best way to audit reading of entities with LinQ in EF6?在 EF6 中使用 LinQ 审核实体读取的最佳方法是什么?
【发布时间】:2019-10-31 07:39:18
【问题描述】:

我有一个代码优先的 EF 数据库设置,可通过前端的 OData 控制器进行访问。

我正在尝试审核用户加载的实体。

LinQ 执行后如何拦截物化实体?

例如:

var entity = _service.Queryable().FirstOrDefault(x => x.ID == key);

我想在实体实现并可以访问它之后添加一个自定义操作。

我尝试使用 DbContext.Database.Log,但我只得到 EF 生成的查询。

【问题讨论】:

    标签: c# entity-framework-6 linq-to-entities


    【解决方案1】:

    这是使用ObjectMaterialized 事件的一种方法

    using (var context = new EntityContext())
    {
        // could be set globally in the constructor
        var materialized = new List<object>();
        ((IObjectContextAdapter) context).ObjectContext.ObjectMaterialized += (sender, args) => materialized.Add(args.Entity);
    
        var list = context.Customers.ToList();
    
        FiddleHelper.WriteTable(materialized);      
    }
    

    在线示例:https://dotnetfiddle.net/yzmlSO

    【讨论】:

      【解决方案2】:

      解决方案其实很简单。

      由于我只想记录来自前端的用户请求,因此我扩展了 OData 控制器以在请求实体时添加审核日志。

      这样,无论后端做了什么 LinQ 过滤,我都可以访问到用户请求的结果:

      var entity = _service.Queryable().Where(x => x.ID == key);
      Logger.AddAuditLog(entity);
      //... continue execution
      

      希望这对某人有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-16
        • 1970-01-01
        • 2012-03-26
        • 2012-01-08
        • 1970-01-01
        • 2012-07-20
        • 2021-10-26
        • 1970-01-01
        相关资源
        最近更新 更多