小数位没有正确舍入 - 这是一个LINQ to SQL错误?

Pau*_*and 8 c# sql-server rounding linq-to-sql

我的数据库字段(sql server 2005)使用数字(15,2)定义.

LINQ 2 SQL生成的属性是

    [Column(Storage="_My_Property_Name", DbType="Decimal(15,2)", UpdateCheck=UpdateCheck.Never)]
    public System.Nullable<decimal> My_Property_Name
    {
        get
        {
            return this._My_Property_Name;
        }
        set
        {
            if ((this._My_Property_Name != value))
            {
                this.OnMy_Property_NameChanging(value);
                this.SendPropertyChanging();
                this._My_Property_Name = value;
                this.SendPropertyChanged("My_Property_Name");
                this.OnMy_Property_NameChanged();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

在调试中我检查此属性的实体值= 23.6363636363(等)

然后我跳过context.SubmitChanges()

我有SQL Profiler运行,这是更新语句.

exec sp_executesql N'
UPDATE [Staging].[My_Table_Name]
    SET [LAST_UPDATE_DATE] = @p2, [Field1] = @p3, [Field2] = @p4, [Field3] = @p5, [Field4] = @p6, [Field5] = @p7, [Field6] = @p8, [Field7] = @p9
WHERE ([Id] = @p0) AND ([RecordVersion] = @p1)

SELECT [t1].[RecordVersion] FROM [Staging].[My_Table_Name] AS [t1]
WHERE ((@@ROWCOUNT) > 0) AND ([t1].[Id] = @p10)',N'@p0 int,@p1 timestamp,@p2 datetime,@p3 decimal(21,8),@p4 decimal(21,8),@p5 decimal(21,8),@p6 decimal(21,8), @p7 decimal(21,8),@p8 decimal(21,8),@p9 decimal(15,2),@p10 int',@p0=2935,@p1=0x0000000000323018,@p2='2010-02-26 16:49:21:690', @p3=99.99992307,@p4=99.99992307,@p5=99.99992307,@p6=99.99992307,@p7=99.99992307,@p8=99.99992307,
@p9=23.63,@p10=2935
Run Code Online (Sandbox Code Playgroud)

你可以看到@ p9 = 23.63,我希望它是23.64.

更新

我的问题是,

如果这是一个LINQ to SQL错误,我希望它是一个已知的错误,我会在哪里找到它; 在哪里有一个维护的错误列表?

还有什么是最好的工作?

  • 我猜测将字段更改为15,3不会修复错误,它只会将其移位1位小数.
  • 覆盖OnMy_Property_NameChanged()将适用于此属性,但我有很多.

更新2

这也不起作用,它在提交更改之前进入这段代码并且似乎工作,但生成的更新sql仍然具有截断值,而不是此更新的舍入值.

partial void OnMy_Property_Name_ChangingChanging(decimal? value)
{
    if (!value.HasValue)
    {
        return;
    }
    value = 
        Math.Round(value.Value, 2, MidpointRounding.AwayFromZero);
}
Run Code Online (Sandbox Code Playgroud)

我目前得到的修复只是直接更新实体值.

Joh*_*lph 1

MSDN说:

Decimal 和 Money 类型 SQL Server DECIMAL 类型的默认精度(小数点左右各 18 位十进制数字)比默认情况下与之配对的 CLR Decimal 类型的精度小得多。当您将数据保存到数据库时,这可能会导致精度损失。但是,如果 SQL Server DECIMAL 类型配置的精度大于 29 位,则可能会发生相反的情况。当 SQL Server DECIMAL 类型配置的精度高于 CLR System.Decimal 时,从数据库检索数据时可能会发生精度丢失。

您可以通过覆盖OnMy_Property_NameChanged()并舍入它来处理这个问题。确保指定正确的舍入模式(到偶数或从零开始)。