问题点:
在前端某个值保存3位小数后,再刷新页面发现该数据四舍五入到2位小数
排查:
前端的问题,发现前端请求里数据确实是3位
后端的问题,经过调试跟踪发现实体里数据也是3位的,于是乎利用sql server的profiler跟踪,发现跟踪到的sql语句参数化里的decimal是(18,2)的类型,所以应该是ef core转的时候默认类型的问题
解决:
经过查询资料大概有几种修改这默认类型的方法
对某个表或者某些表的字段设置
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);
}
对所有实体的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);
}
}