Mi campo de base de datos (sql server 2005) se define con numérico (15,2).Lugares decimales que no se redondean correctamente: ¿se trata de un error LINQ to SQL?
El LINQ 2 SQL propiedad generado es
[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();
}
}
}
En depuración puedo comprobar el valor de la entidad para esta propiedad = 23.6363636363 (etc)
I a continuación, pasar por encima de context.SubmitChanges()
Tengo SQL Profiler en ejecución y esta es la declaración de actualización.
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
Como puede ver @ p9 = 23.63, yo esperaría que fuera 23.64.
actualización
Mi pregunta es,
Si se trata de un error de LINQ to SQL que sería de esperar que sea un conocido, donde iba a averiguarlo; ¿Hay alguna lista de errores mantenidos en algún lugar?
También ¿cuál sería el mejor trabajo?
- supongo cambiar el campo a 15,3 no corregir el error, sería simplemente desplazarlo 1 decimal.
- Reemplazar el OnMy_Property_NameChanged() funcionaría para esta propiedad, pero tengo muchos de ellos.
Actualización 2
esto no funcionaba bien, entra en este pedazo de código antes de SubmitChanges y parece funcionar, pero la actualización SQL generado todavía tiene el valor truncado, no se actualizó esta redondeado valor.
partial void OnMy_Property_Name_ChangingChanging(decimal? value)
{
if (!value.HasValue)
{
return;
}
value =
Math.Round(value.Value, 2, MidpointRounding.AwayFromZero);
}
La solución que tengo en este momento es simplemente actualizar el valor de la entidad directamente.
si actualizo la base de datos directamente con 23.63636363636363 entonces se convierte en 23.64 .... que está bien. si anulo la propiedad, se arreglaría esta propiedad, pero es una gran base de datos con un montón de 15,2 campos definidos ... Realmente no quiero hacer eso para todos. ¿Pensaría que si esto es un error de Linq 2 Sql se habría encontrado antes? (gracias por la respuesta) –
Sugiero profundizar en el interior de linq2sql utilizando un reflector si se siente seguro al respecto. Obviamente es algo sobre el generador de consultas. –