2013-02-19 65 views
5

我想了解为什么实体框架4在EF架构模型和数据库中四舍五入到两位小数时,精度设置为4.当一切都设置为四位十进制时,实体框架以小数点后两位进行舍入

这是十进制场我的一个模式定义:

SellPrice specify a scale of 19,4

这是我的数据库定义

CREATE TABLE OrderItems(
.... 
[SellPrice] [decimal](19, 4) NOT NULL, 
.... 

当我计算了产品的销售价格后,执行我的插入查询,我看到有足够的小数

SellPrice shows lots of decimals

的MiniProfiler显示我的查询,并将其显示值有小数

DECLARE ... 
     @15 Decimal = '100,54347826086956521739130435', 
     ... 

insert [dbo].[OrderItems](..., [SellPrice], ...) 
values (..., @15, ....) 
select [OrderItemId] 
from [dbo].[OrderItems] 
where @@ROWCOUNT > 0 and [OrderItemId] = scope_identity() 

但是,当我看到通过Microsoft SQL事件探查器中,SellPrice四舍五入

exec sp_executesql N'insert [dbo].[OrderItems](..., [SellPrice], ...) 
values (..., @15, ...)', 
...,@15=100.54,...' 

我无法找到值被舍入的位置。

+0

此信息有帮助吗? http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/c423a005-6a42-4f8d-aab6-e13fe3bdffba – mbeckish 2013-02-19 20:30:30

回答

3

在猜测,我会说,你的SQL数据类型应该是money,不decimal在C#decimal一样decimal SQL。特别是,如果您查看MSDN文档(http://msdn.microsoft.com/en-us/library/ms187746.aspx)中的TSQL decimal类型是状态;

在Transact-SQL语句中,使用必需的最小精度和小数位数,将带小数点的常量自动转换为数值数据值。例如,将常量12.345转换为数值,精度为5,刻度为3.

将十进制或数字转换为浮点或实数可能会导致某些精度损失。

没有明确指出这是你的问题的原因,但我会很好地猜测它是这样的。您可能会因为money数据类型而带来更多运气,因为这是最平等的,这也是EF从现有数据库生成模型时默认设置的内容。

+2

我试图将字段设置为金钱。这是行不通的。我也尝试过创建另一个实体模型来查看它们的映射方式,它的显示精度为19,刻度为4,但Sql Profiler仍显示为十进制(19,2)。 它一定是在别的地方,但我找不到在哪里。 – 2013-03-08 15:17:03

+1

@ Pierre-AlainVigeant,您是否明确设置了比例和精度,或者当您尝试更新EF图表/数据库时,是否自动为您设置?另一方面,你是首先创建数据库还是模型? – DiskJunky 2013-03-08 18:44:52

相关问题