2012-04-16 34 views
2

我有一个数据库字段定义为十进制(9,9)。 C#中的edmx模型将此字段映射为精度和比例为9的十进制变量。保存添加额外的小数位

我把数字5放在变量中。我可以检查的任何地方显示值为5(在局部变量,实体类实例,数据上下文等中)。

DataContex.SaveChanges()时,该值被转换为“5.000000000”。尽我所能地告诉实体框架在将数据保存到数据库之前将9个小数位添加到该值。这会导致错误,因为该值现在有太多数字。

有没有人知道是什么原因导致了这种行为,我该如何改变它?

添加信息 - 我开始在Microsoft SQL 2008 R2中创建数据库。然后我从数据库中生成实体框架模型。

+0

你把5存为一个字符串吗?或者作为一个小数?或者int? – abatishchev 2012-04-16 17:07:00

+0

在程序中我输入了一个5.0的值。检查变量在Visual Studio中显示“十进制”值为5。 – 2012-04-16 17:22:33

+0

@abatishchev如果你正在谈论数字文字,那么5.0是双倍的,但5.0m是十进制。 – phoog 2012-04-16 17:30:54

回答

2

如果您确实在数据库中将数据类型定义为decimal(9,9),则说明您遇到问题。
根据Microsoft,第一个数字是总位数,第二个是小数点右边的位数。
所以你真的只能在这样的字段中存储低于1的数字,格式为.123456789。 如果你需要存储5,你将需要一个不同的格式。

+0

被引用的页面将这些值列为“最大”值,我将其作为可能的限制读取,而不是必需的ammount。我将它改为'decimal(9,4)',一切正常。我正在将你的回复标记为未知。谢谢。 – 2012-04-16 18:34:22

+0

是的,当你像这样读取参考页时是不明确的,但是在SQL中,十进制实际上是一个定点类型(与C#的小数点相比,这更灵活)。 – 2012-04-17 05:54:45

1

这不是特别针对实体框架,而是预期的精度定义为9的小数(映射回您的数据库)。所以,当你输入5时,由于数据的定义方式,那么0就会在小数点后面加上。

这是在.NET 1.1中实现的,以符合标准(我忘记了哪一个)。出于显示目的,您总是可以使用Math.Round来移除精度级别(或根据实际需要以不同方式定义数据)。

+0

精度级别已经在C#中舍入了。保存时添加额外数字(小数点右侧)。在C#中我无法删除任何内容,因为该值仅显示为5(没有小数点或多余的数字)。 – 2012-04-16 17:06:05

+0

@JeremyLund - 您可以通过以下链接中的信息覆盖精度:http://stackoverflow.com/questions/3504660/entity-framework-code-first-decimal-precision。我不直接知道你的评论的答案,因为我从未遇到过这种具体情况。 – JasCav 2012-04-16 17:09:40

+0

感谢您的建议,但我使用Model First,模型已经包含与数据库匹配的精度和比例(9,9)的正确属性。这就是为什么我如此粗暴以至于超出了这个定义的精度和范围。 – 2012-04-16 17:12:58