首页 > 其他分享 >ef使用json类型无法触发更新排查

ef使用json类型无法触发更新排查

时间:2023-08-08 17:11:57浏览次数:47  
标签:触发 return 代码 ef 更新 排查 json

一.问题背景

 

 

首先诸位请看以上代码,不知道有没有发现什么问题?

3

2

1

 

集成流的配置,目前是使用json结构,保存到数据库中的。当初加这个的时候就有发现,没有写update不更新,但是当初因为一些原因,没有主动去深究这个问题,而是手动补了一行update去触发更新。这几天在调整集成流配置结构的时候,发现了之前写的这个代码,并深究了一下原因。

二.问题定位

 

首先可以来看一下另一段代码,同样的场景,类似的结构,但是上面这段代码可以触发ef的更新,同学们,发动你们聪明的小脑瓜,有没有想到为什么?这里与异常代码的区别是这里的steps重新赋了个值,基于以上现象,我们推测是因为异常代码只是替换了json内部数据,但是没有更改引用类型的引用地址,导致ef的跟踪器没有触发跟踪。基于以上猜测,我们去翻阅到了一些资料

 

 

综上所述,确实是由于我们使用了json类型,导致部分数据的变更,没有触发跟踪器的跟踪,为此,我们补上了以下代码

首先我们实现了了一个值比较器,使用json的md5去校验值是否变更

public class GenericComparer<T> : ValueComparer<T> where T:new()
    {
        public GenericComparer() : base((s, t) => Equal(s, t), CreateDefaultHashCodeExpression(false), c => SnapShot(c))
        {

        }

        public static bool Equal(T? s, T? t)
        {
            if (s == null || t == null)
            {
                return false;
            }
            return s.ToJsonInDb().ToMd5() == t.ToJsonInDb().ToMd5();
        }

        public static T SnapShot(T c)
        {
            if (c is null) { return new(); }
            return c.Adapt<T>();
        }
    }

 

 

然后在数据库上下文配置中加上了以下配置

 

添加了这两段代码之后,ef上下文即可检测到值的变更,进而跟踪数据,生成正确的sql语句。

 

 

await Repository.Respositiy<BAS_FlowConfig>().UpdateAsync(flowConfig);

另外我们再来看看由主动触发更新,生成的ef更新语句,这里的更新是会更新整行数据的所有字段,而正常由ef跟踪形成的sql,是只更新修改过的字段,所以减少主动更新的使用,可以提高一部分性能。

 

三.结论

  1. 复杂类型的数据,需要自己定义值比较器,否则引用地址不变,ef无法正确获取值的变更
  2. 主动update会更新整行数据所有字段,由ef跟踪形成的sql,只更新修改过的字段,减少主动更新的使用,可以提高一部分性能。

 

四.参考文档

https://learn.microsoft.com/zh-cn/ef/core/modeling/value-comparers?tabs=ef5

标签:触发,return,代码,ef,更新,排查,json
From: https://www.cnblogs.com/qcqc/p/17614852.html

相关文章

  • Sqoop 连接mysql 错误 java.lang.NoClassDefFoundError(已解决)
    错误信息Exceptioninthread"main"java.lang.NoClassDefFoundError:org/apache/commons/lang/StringUtilsatorg.apache.sqoop.manager.MySQLManager.initOptionDefaults(MySQLManager.java:73)atorg.apache.sqoop.manager.SqlManager.<init......
  • json web token(jwt)详解
    1.jsonwebtoken是什么?JSONWebToken(JWT)是一个开放标准(RFC7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。 2.什么时候你应该用JSONWebTokens下列场景中使用JSONWebToken是......
  • codeforces 891 (div3)857E - Power of Points
    E.点的力量每个测试限时2秒每个测试限制内存为256兆字节输入以标准格式输入输出以标准格式输出给定n个具有整数坐标x1,…xn的点,这些点位于数线上。对于某个整数s,我们构建段[s,x1],[s,x2],…,[s,xn]。注意,如果xi<s,则段将类似于[xi,s]。段[a,b]覆盖了所有整数点a,a+1,a+2,…,b。......
  • DataFrame 按行转json数据
    importpandasaspd#创建示例DataFramedata={'Name':['Alice','Bob','Charlie'],'Age':[25,30,35],'Occupation':['Engineer','Teacher','Doctor']......
  • 前后端数据传输的编码格式,Ajax提交json格式的数据,Ajax提交文件数据,AJax结合layer弹
    前后端数据传输的编码格式(contentType)#前后端数据传输的时候请求方式有2种:getpost我们不研究get请求的url?a=1&b=2#我们只研究post请求的编码格式三种编码格式:urlencodedform-datajson#可以通过哪些方式发送post请求form表单Ajaxpostman请求头中的Content-......
  • refresh、reread、research and executeQuery
    X++developersseemtobehavingalotoftroublewiththese4datasourcemethods,nomatterhowseniortheyareinAX.SoIdecidedtomakeasmallhands-ontutorial,demonstratingthecommonusagescenarioforeachofthemethods.Ihaveorderedthemet......
  • 第五节:EF Core中的三类事务(SaveChanges、DbContextTransaction、TransactionScope)
    第五节:EFCore中的三类事务(SaveChanges、DbContextTransaction、TransactionScope)原文链接:https://blog.csdn.net/weixin_30954265/article/details/101542615?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-10154......
  • EF Core事务
    EFCore事务原文链接:https://blog.csdn.net/m0_47659279/article/details/119929767EFCore事务EFCore提供了SaveChange方法,可以把数据操作好之后再统一调用SaveChange方法,这样就实现了简单的事务功能如果需要多个SaveChange形成一个事务,就是说多个SaveChange要么全部成......
  • Spring Boot返回Json
    我们在前面的接口示例中是直接返回的字符串如下:但是我们有时候是需要返回json对象的。SpringBoot封装了JSON解析包Jackson的功能,只需要直接返回一个实体即可实现json的格式。如下:新建实体Sex.javapackagecom.biologic.entity;publicclassSex{privateStringsex;......
  • Codeforces 1857D:Strong Vertices 与图论无关的出度最大统计
    1857D.StrongVerticesDescription:给定两个长度均为\(n\)的数组\(a\)和\(b\)(编号\(1\)~\(n\)),如果\(a_u-a_v\geqb_u-b_v\)\((u\neqv)\),那么从\(u\)到\(v\)建立一条有向边。"Strong"定义为:一个点\(V\)可以经过有向图中合法的通路到达其他所有的点。请求解出"......