奕玖科技 > 新闻中心 > 技术文章

c# efcode 数据的自动转换及值对比器的封装

来源: 奕玖科技 Fly | 2025/6/17 11:30:17

我们在数据库设计的时候,有一些字段需要输入JSON/数组格式的话在EfCode里就需要转换。当然我们也可以不转换值,那么JSON格式的数据就需要转换为字符串存入数据库中,然后从数据库里取出来在转换为JSON,这样就增加了很多的工作量。那么在这种前提下,我们就需要对数据进行自动的转换。

20230205638111977198393274.png

     protected override void OnModelCreating(ModelBuilder modelBuilder)
     {
         modelBuilder.Entity<Coupon>(b =>
         {

             b.Property(b => b.ExpireTime).HasConversion(v => My.Stringify(v) ?? "[]", v => My.GetJson<string>(v));
         });

     }

上诉代码就是转换一个时间的数据,让数据库取出的字符串自动变为LIST数组。这样我们就不需要特意的转换了。

但如果仅仅是上面的代码,虽然使用没有问题,但是我们在数据库迁移中没有做值比较的话就会导致迁移失败,那么如果正常使用的话代码就要改写一下了。如下

                b.Property(b => b.ExpireTime).HasConversion(v => My.Stringify(v) ?? "[]"
                ,
                v => My.GetJson<string>(v),
                  new ValueComparer<IEnumerable<string>>(
            (c1, c2) => c1!.SequenceEqual(c2!),
            c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())),
            // c tolist 的话就是复制一份
            c => c.ToList()
            )
                );
            });

上诉代码看起来是不是很杂乱不堪,如果需要转换的字段比较多可读性和美观都非常差?那么我们就需要进行一下优雅的封装看了。首先建立一个拓展类文件EntityTypeBuilderExtensions.cs

    public static class EntityTypeBuilderExtensions
    {
        /// <summary>
        /// 比较泛型的数据如[{txt:1}]
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="propertyBuilder"></param>
        /// <returns></returns>
        public static PropertyBuilder<IEnumerable<T>> HasJsonConversionList<T>(
            this PropertyBuilder<IEnumerable<T>> propertyBuilder)
        {
            return propertyBuilder
                .HasConversion(
                v => My.Stringify(v) ?? "[]",
                v => My.GetJson<T>(v),
                 new ValueComparer<IEnumerable<T>>(
            (c1, c2) => c1!.SequenceEqual(c2!),
            c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v!.GetHashCode())),
            // c tolist 的话就是复制一份
            c => c.ToList()
            )
                );
              
        }
        /// <summary>
        /// 比较对象如{txt:1}
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="propertyBuilder"></param>
        /// <returns></returns>
        public static PropertyBuilder<T> HasJsonConversion<T>(
            this PropertyBuilder<T> propertyBuilder) where T : class, new()
        {
            return propertyBuilder
                .HasConversion(
                v => My.Stringify(v) ?? "{}",
                v => My.Parse<T>(v) ?? new T(),
                  new ValueComparer<T>(
                (l, r) => (l == null && r == null) || (l != null && l.Equals(r)),
                v => v == null ? 0 : v.GetHashCode(),
            v => v == null? new T(): My.Parse<T>(v) ?? new T()
            )
            );

        }
    }

这是我设计的类来比较2种类型的数据,当然您可以根据自己的需求进行设计。创建好后然后我们在OnModelCreating里的代码就可以非常简洁了。代码如下

         protected override void OnModelCreating(ModelBuilder modelBuilder)
        {

            modelBuilder.Entity<HkUser>(b =>
            {
                b.Property(b => b.IdCard).HasJsonConversionList<string>();
            });
           
            modelBuilder.Entity<Orders>().Property(o => o.Address).HasJsonConversion<Address>();
        }

怎么样,看起来是不是简洁多了。通过上诉的操作我们就可以自由的往数据库里存入json类型的数据而在取出后又可以自动的转换成相应的数据类型。好了,如果您有C#类型的开发可以联系我们,微信和QQ号码都是:24722

栏目导航
相关文章
文章标签
关于我们
公司简介
企业文化
资质荣誉
服务项目
高端网站定制
微信小程序开发
SEO排名推广
新闻动态
行业新闻
技术学院
常见问题
联系我们
联系我们
人才招聘
联系方式
Q Q:24722
微信:24722
电话:13207941926
地址:江西省抚州市赣东大道融旺国际3栋
Copyright©2008-2022 抚州市奕玖科技有限公司 备案号:赣ICP备2022010182号-1