ef core decimal类型默认精度和小数位设置

文章描述了一位开发者遇到的问题,即前端数据显示的数据被四舍五入到2位小数,而实际上请求和后端数据都是3位小数。问题根源在于EFCore在转换时使用的decimal类型默认精度。解决方案包括针对特定实体属性设置精度,批量修改某些字段的精度,以及全局修改EFCore对decimal类型的默认精度配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题点:

在前端某个值保存3位小数后,再刷新页面发现该数据四舍五入到2位小数

排查:

  1. 前端的问题,发现前端请求里数据确实是3位

  1. 后端的问题,经过调试跟踪发现实体里数据也是3位的,于是乎利用sql server的profiler跟踪,发现跟踪到的sql语句参数化里的decimal是(18,2)的类型,所以应该是ef core转的时候默认类型的问题

解决:

经过查询资料大概有几种修改这默认类型的方法

  1. 对某个表或者某些表的字段设置

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<XXX>().Property(e => e.XXX).HasPrecision(precision, scale);
}

如果批量的话可以类似这样

protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
    {
        var properties = new[]
        {
            modelBuilder.Entity<Product>().Property(product => product.Price),
            modelBuilder.Entity<Order>().Property(order => order.OrderTotal),
            modelBuilder.Entity<OrderDetail>().Property(detail => detail.Total),
            modelBuilder.Entity<Option>().Property(option => option.Price)
        };

        properties.ToList().ForEach(property =>
        {
            property.Precision = 10;
            property.Scale = 2;
        });

        base.OnModelCreating(modelBuilder);
    }
  1. 对所有实体的decimal类型的属性进行修改,即修改ef core关于decimal类型的精度默认值

ef core 6即以上:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Properties<decimal>().Configure(config => config.HasPrecision(precision, scale));
}

ef core 6以下:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            var fixDecimalDatas = new List<Tuple<Type, Type, string>>();
            foreach (var entityType in modelBuilder.Model.GetEntityTypes())
            {
                foreach (var property in entityType.GetProperties())
                {
                    if (Type.GetTypeCode(property.ClrType) == TypeCode.Decimal)
                    {
                        fixDecimalDatas.Add(new Tuple<Type, Type, string>(entityType.ClrType, property.ClrType, property.Name));
                    }
                }
            }

            foreach (var item in fixDecimalDatas)
            {
                modelBuilder.Entity(item.Item1).Property(item.Item2, item.Item3).HasPrecision(precision, scale);
            }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值