EF Core中decimal精度配置首选HasPrecision方法,在OnModelCreating中显式调用并确保base.OnModelCreating最后执行;可辅以自定义特性批量标记,或全局配置Properties(),但需注意迁移更新与优先级冲突。

EF Core 默认把 decimal 映射为数据库的 decimal(18,2),这在多数财务场景下不够用——比如需要保留3位小数(如重量、利率),或总位数超18(如大额交易金额)。关键不是“能不能设”,而是“在哪设、怎么设才稳定生效”。
这是最常用也最可靠的方式,必须在 OnModelCreating 中显式调用,并确保 base.OnModelCreating(modelBuilder) 在最后执行:
HasPrecision(precision, scale) 是语义级配置,EF Core 会据此生成对应数据库类型(如 SQL Server 的 decimal(10,3))HasColumnType("decimal(10,3)") 混用,后者是硬编码字符串,绕过 EF 的类型推导,容易与迁移冲突modelBuilder.Entity<order>().Property(x => x.TaxAmount).HasPrecision(12, 4);</order>
适合中大型项目,避免在 OnModelCreating 里逐个写重复代码。先定义特性:
[AttributeUsage(AttributeTargets.Property)]
public class DecimalPrecisionAttribute : Attribute
{
public byte Precision { get; }
public byte Scale { get; }
public DecimalPrecisionAttribute(byte precision = 18, byte scale = 2)
{
Precision = precision;
Scale = scale;
}
}然后在实体属性上使用:
[DecimalPrecision(10, 2)]
public decimal UnitPrice { get; set; }再在 OnModelCreating 中批量扫描并应用:
decimal 属性 → 调用 HasPrecision
base.OnModelCreating 之前完成扫描和配置,否则会被覆盖EF Core 6+ 支持按类型批量配置:
modelBuilder.Properties<decimal>()
.Configure(c => c.HasPrecision(10, 2));这个写法会作用于**所有未被单独配置过的 decimal 属性**,包括导航属性中的 decimal(如有)。优点是省事,缺点是灵活性差——比如你有一个 Rate 字段需要 (5,4),就得额外再单独覆盖一次。
很多“配置不生效”其实不是代码问题,而是环境或操作细节没到位:
dotnet ef migrations add xxx 重新生成迁移脚本 —— 配置只影响新迁移,不会自动修正已有表结构decimal(18,2),但迁移没包含 AlterColumn 操作 → 检查迁移文件里是否有对应变更[Column(TypeName = "decimal(10,2)")] 但没生效 → 这个特性在较新 EF Core 版本中已被弱化,优先级低于 Fluent API,建议弃用基本上就这些。核心逻辑很清晰:HasPrecision 是推荐入口,特性用于组织,全局配置仅作兜底。只要迁移跟得上、类型对得准,decimal 精度就不会丢。
以上就是EF Core怎么处理decimal精度 EF Core HasPrecision配置方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号