Linq to SQL:为什么在Insert上截断十进制字段?

Ema*_*uel 6 c# linq sql-server decimal decimal-point

我有一个列定义为decimal(10,6).当我尝试使用值保存模型时10.12345,在数据库中我保存为10.123400.最后一位数字("5")被截断.

为什么LINQ中的数字默认只有4位数(对于十进制数),如何在模型中的所有列中避免这种情况?我找到的解决方案是使用DbType="Decimal(10,6)",但我在这种情况下有很多专栏,所有的改变都应该适用,我不认为这是一个好主意.

有没有办法在不更改所有十进制列的情况下更改此行为?

谢谢

Lua*_*aan 2

decimal(10, 6)在这种情况下,您需要使用正确的 DbType 。

原因很简单 - 虽然 .NETdecimal实际上是一个(十进制)浮点(小数点可以移动),但 MS SQL 却不是。它是固定的“小数点左四位,小数点右六位”。当 LINQ 将数据传递decimal给 MS SQL 时,它必须使用特定的 SQL 小数 - 而默认值恰好使用 4 作为小数位数。decimal对于您想要传递的任何值,您始终可以使用足够大的值,但这非常不切实际 - 一方面,它将几乎消除执行计划缓存,因为每个不同的decimal(p, s)需求都将是其自己的单独查询。如果您传递多个小数,这意味着您几乎永远不会获得缓存的计划;哎哟。

实际上,该命令并不发送值10.12345- 它发送10123450(不完全正确,但请耐心等待)。因此,当您传递参数时,您必须知道比例 -例如,您需要发送10为。10000000当您不使用 LINQ 时,这同样适用 -SqlCommand手动使用具有相同的“问题”,并且您必须使用特定的精度和小数位数。

如果您对手动修改所有这些列持谨慎态度,只需编写一个脚本来为您完成此操作。但您确实需要手动维护正确的数据类型,这是没有办法解决的。