Entity Framework Code-First迁移:Decimal字段意外舍入问题
哥们,我太懂这种明明改了迁移文件却没生效的憋屈了!你遇到的这个Decimal精度被莫名舍入到2位的问题,大概率是实体类里没给Decimal字段显式配置精度导致的——光改迁移文件可不够,EF Code-First下次生成迁移时还会给你改回去,而且运行时也会默认用2位小数的规则处理数据!
下面是我踩过这个坑后总结的解决步骤,亲测有效:
1. 先给实体类的Price字段补全配置
这是最关键的一步,EF是靠实体类的配置来识别字段规则的,光改迁移文件属于“治标不治本”。
方式一:用数据注解直接标注
在实体类的Price字段上加上[Column(TypeName = "decimal(18,9)")],明确告诉EF这个字段的精度和小数位数:
public class Product { public int Id { get; set; } // 显式指定精度18,小数位9 [Column(TypeName = "decimal(18,9)")] public decimal Price { get; set; } }
方式二:用Fluent API配置(适合偏好代码分离的场景)
如果你不想在实体类里加注解,就在DbContext的OnModelCreating方法里配置:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Product>() .Property(p => p.Price) .HasPrecision(18, 9); // 精度18,小数位9 }
2. 重新生成并执行迁移
别再用之前手动修改过的迁移文件了,按下面的步骤来:
# 如果你已经执行过之前的迁移,先回滚到上一个版本(可选,根据你的实际情况) Update-Database -TargetMigration:"之前的迁移名称" # 生成新的迁移文件,这次EF会根据你实体类的配置生成正确的Decimal规则 Add-Migration UpdatePriceDecimalPrecision # 执行迁移,更新数据库结构 Update-Database
为啥之前改迁移文件没用?
EF Code-First的核心逻辑是实体类+DbContext配置决定数据库结构,你手动修改迁移文件只是临时改了数据库表结构,但EF运行时处理数据的时候,还是会用默认的Decimal配置(默认就是2位小数)来序列化/反序列化数据,所以填充的时候就被舍入了。而且下次生成新的迁移时,EF会根据实体类的默认配置覆盖你手动改的内容,等于白忙活。
最后验证
你可以先打开数据库,检查Price字段的类型是不是真的变成了decimal(18,9),然后调试数据填充代码,看看赋值后的Price变量是不是保留了9位小数,再看插入数据库后的值——只要实体类配置对了,就能正常保存9位小数了!
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

