You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:25:03