EF6数据库优先模式下decimal字段插入值超出范围问题求助
EF6数据库优先模式下decimal(16,2)字段插入报错解决办法
问题场景
采用Database First(数据库优先)模式搭配EF6和SQL Server,数据库中MyTable表的Amount字段类型为decimal(16, 2)。执行以下插入代码时:
MyTable table = New MyTable With { .ID = Guid.NewGuid(), .Amount = 100D }; dbContext.MyTable.Add(table);
提交更改后抛出错误:
ArgumentException: 参数值 '100,0000000000000000' 超出范围。
报错原因
100D是double类型,该类型精度为15-17位小数。当EF尝试将double值转换为decimal提交到数据库时,会保留double的完整精度,但数据库字段仅支持2位小数,导致参数值超出字段精度范围。
解决方法
1. 直接使用decimal类型赋值
将代码中的100D改为100M(M是VB中decimal类型的后缀),确保赋值类型与数据库字段完全匹配:
MyTable table = New MyTable With { .ID = Guid.NewGuid(), .Amount = 100M };
2. 显式转换double为decimal(若需保留double输入)
如果必须使用double类型的值,显式转换为decimal,必要时指定精度:
// 基础转换 .Amount = Convert.ToDecimal(100D) // 确保保留2位小数,匹配数据库字段 .Amount = Math.Round(Convert.ToDecimal(100D), 2)
3. 验证EF实体类属性类型
检查EDMX生成的MyTable实体类中,Amount属性的类型是否为decimal。如果是double,右键EDMX文件选择从数据库更新模型,确保实体类型与数据库字段同步。
内容的提问来源于stack exchange,提问作者MojoDK
相关产品推荐
相关产品推荐

