zoukankan      html  css  js  c++  java
  • 解决EFCore缓存机制导致的数据查询错误问题

    如题,在对同一个Context连续进行相同条件的查询时,会触发EFCore的缓存机制,如果这个过程中数据发生了变化,则会出现错误。

    例如:有两个Context实例,一个负责查询,一个负责增删改, A_Context查询了数据A,而B_Context之后修改了数据A,当A_Context再次以相同条件查询数据A时,由于缓存的影响,将继续查询到未修改的结果。

    因此,可以通过清除指定数据的缓存的方法解决(也可以全局禁用缓存、或禁用某个实体的缓存), 常见的是AsNoTracking()方法, 但由于使用的是Dynamic.Linq的写法,因此无法直接使用。

     public static dynamic GetDataByPrimaryValue(string ModelType, string PrimaryValue)
            {
                Type modelType = PublicHelper.CreateInstanceByClassName(ModelType).GetType();
                var context = DBContextHelper.GetContextByModelType(modelType);
    
                var result = context
                            .Query(modelType)
                            .Where($"{ DBContextHelper.GetModelPrimaryKey(modelType)}==@0", PrimaryValue)
                            .SingleOrDefault();
                context.Entry(result).State = EntityState.Detached;//从缓存中去掉数据
                return result;
            }

    也就是要在查询结束后,从缓存中去掉这次查询的数据即可。

  • 相关阅读:
    thinkphp模块设计
    thinkphp自动创建目录
    thinkphp入口文件
    thinkphp目录结构
    thinkphp环境要求
    获取ThinkPHP
    QueryList getData()方法中多次调用来实现递归多级采集。
    PHP count() 函数
    PHP mysqli_affected_rows() 函数
    QueryList 内容过滤
  • 原文地址:https://www.cnblogs.com/cdoneiX/p/12374439.html
Copyright © 2011-2022 走看看