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

EF Core 默认把 decimal 映射为数据库的 decimal(18,2),这在多数财务场景下不够用——比如需要保留3位小数(如重量、利率),或总位数超18(如大额交易金额)。关键不是“能不能设”,而是“在哪设、怎么设才稳定生效”。
直接用 HasPrecision 配置单个字段
这是最常用也最可靠的方式,必须在 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>
用自定义特性统一标记 decimal 字段
适合中大型项目,避免在 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 中批量扫描并应用:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~