0

0

EF Core怎么处理decimal精度 EF Core HasPrecision配置方法

星降

星降

发布时间:2025-12-18 08:51:33

|

717人浏览过

|

来源于php中文网

原创

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

ef core怎么处理decimal精度 ef core hasprecision配置方法

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().Property(x => x.TaxAmount).HasPrecision(12, 4);

用自定义特性统一标记 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 中批量扫描并应用:

Facet
Facet

Facet.ai是一款AI图像生成和编辑工具,具备实时图像生成和编辑功能

下载
  • 遍历所有实体类型 → 找出带该特性的 decimal 属性 → 调用 HasPrecision
  • 注意:必须在 base.OnModelCreating 之前完成扫描和配置,否则会被覆盖

全局修改所有 decimal 的默认精度(慎用)

EF Core 6+ 支持按类型批量配置:

modelBuilder.Properties()
    .Configure(c => c.HasPrecision(10, 2));

这个写法会作用于**所有未被单独配置过的 decimal 属性**,包括导航属性中的 decimal(如有)。优点是省事,缺点是灵活性差——比如你有一个 Rate 字段需要 (5,4),就得额外再单独覆盖一次。

常见失效原因和避坑点

很多“配置不生效”其实不是代码问题,而是环境或操作细节没到位:

  • 没运行 dotnet ef migrations add xxx 重新生成迁移脚本 —— 配置只影响新迁移,不会自动修正已有表结构
  • SQL Server 中已存在的列类型是 decimal(18,2),但迁移没包含 AlterColumn 操作 → 检查迁移文件里是否有对应变更
  • 用了 [Column(TypeName = "decimal(10,2)")] 但没生效 → 这个特性在较新 EF Core 版本中已被弱化,优先级低于 Fluent API,建议弃用
  • 前端传入 3 位小数但存进库只剩 2 位 → 先确认数据库列实际类型(用 SSMS 查看表定义),再确认 EF 是否真生成了带 scale 的迁移

基本上就这些。核心逻辑很清晰:HasPrecision 是推荐入口,特性用于组织,全局配置仅作兜底。只要迁移跟得上、类型对得准,decimal 精度就不会丢。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

684

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

323

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1117

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

359

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

717

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

577

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

419

2024.04.29

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9.1万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.8万人学习

Vue 教程
Vue 教程

共42课时 | 6.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号