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

.NET Decimal精度与SQL Server Decimal(13,0)不匹配,EF6插入报错如何解决

EF 6 Decimal参数精度溢出问题解决方案

根因说明

报错的核心原因是EF 6在识别带小数位的Decimal值时,会按照值的字面量自动计算精度:1000001231001.0会被判定为总位数14、小数位1的Decimal(14,1)类型,超出了SQL Server字段Decimal(13,0)的定义上限,与参数传递时的字符串格式无关。

以下是三种适配Database First模式的解决方案,无需修改数据库字段类型:


方案1:修改EDMX模型属性配置(推荐,适配Database First开发流程)

直接修改EDMX模型中对应字段的精度定义即可,无需修改业务代码:

  • 打开项目中的.edmx模型设计器,找到所有涉及ACCOUNT_NO字段的实体属性
  • 右键点击该属性选择「属性」,在属性面板中设置精度为13、小数位数为0
  • 保存EDMX后重新生成实体类,后续EF生成SQL参数时会自动对齐配置的精度,不会触发范围报错

方案2:赋值时显式转换抹除小数位

如果不想修改EDMX配置,可在业务代码赋值时做一次类型转换,强制清除小数部分:

// 原始待赋值的decimal值
decimal rawAccountNo = 1000001231001.0m;
// 先转long类型抹除小数位,再转回decimal,保证小数位为0
entity.ACCOUNT_NO = (decimal)(long)rawAccountNo;

转换后的值会被EF识别为小数位为0的Decimal类型,不会触发精度校验错误。


方案3:全局配置字段精度约定(适配多表批量场景)

如果ACCOUNT_NO字段分布在多张表中,逐个修改EDMX属性成本较高,可通过自定义EF约定全局配置:

  1. 为你的DbContext类创建partial扩展类,避免更新EDMX时覆盖自定义配置
  2. 在OnModelCreating方法中添加以下配置:
public partial class YourDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // 针对所有名为ACCOUNT_NO的decimal类型字段统一配置精度
        modelBuilder.Properties()
                    .Where(p => p.Name == "ACCOUNT_NO" && p.PropertyType == typeof(decimal))
                    .Configure(p => p.HasPrecision(13, 0));
    }
}

配置后EF会对所有匹配的字段自动应用精度规则,无需逐个调整。


内容的提问来源于stack exchange,提问作者Serge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:12:02