C#与SQL Server中Decimal值超出范围问题排查
解决EF插入decimal(38,2)字段时的参数超出范围异常
问题出在Entity Framework对decimal类型的默认映射精度设置上:EF默认会把C#的decimal类型映射为SQL Server的decimal(18,2),但你的数据库字段是decimal(38,2),当数值超过18位有效数字时,EF生成的参数会因为精度不足触发范围异常,哪怕数据库本身支持更大的数值。
只需要在实体映射配置中显式指定与数据库一致的精度和小数位数即可解决:
修改EF6及更早版本的配置
在CardConfiguration类的CardNumber配置链中添加.HasPrecision(38, 2):
public class CardConfiguration : TrackedEntityConfiguration<Card> { public CardConfiguration() { ToTable("Card", "dbo"); Property(c => c.CardNumber) .HasColumnName("card_number") .IsRequired() .HasPrecision(38, 2); // 显式指定精度和小数位 } }
修改EF Core版本的配置
EF Core 2.0+支持直接用.HasPrecision,也可以用.HasColumnType指定完整类型:
public class CardConfiguration : TrackedEntityConfiguration<Card> { public CardConfiguration() { ToTable("Card", "dbo"); Property(c => c.CardNumber) .HasColumnName("card_number") .IsRequired() .HasPrecision(38, 2); // 或使用 .HasColumnType("decimal(38,2)") } }
配置完成后重新运行插入代码,EF会生成匹配数据库字段精度的参数,就不会再出现范围异常了。
内容的提问来源于stack exchange,提问作者the1.9gpaProgrammer
相关产品推荐
相关产品推荐

