Mon champ de base de données (SQL Server 2005) est défini avec numeric (15,2).Les décimales ne sont pas arrondies correctement - est-ce un bug LINQ to SQL?
Le LINQ 2 SQL généré est la propriété
[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 debug je vérifie la valeur de l'entité de cette propriété = 23,6363636363 (etc)
je puis sur l'étape context.SubmitChanges()
J'ai SQL Profiler en cours d'exécution et c'est l'instruction de mise à jour.
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
Comme vous pouvez le voir @ p9 = 23.63, je m'attendrais à ce qu'il soit 23.64.
Mise à jour
Ma question est,
Si cela est un LINQ bug SQL Je pense que ce soit un connu, où pourrais-je trouver cela; Y at-il une liste de bogues maintenue quelque part?
Quel serait le meilleur travail?
- Je devine changer le terrain pour ne résoudrait pas 15,3 le bug, il serait tout simplement la déplacer 1 place décimale.
- Le remplacement de OnMy_Property_NameChanged() fonctionnerait pour cette propriété, mais j'en ai beaucoup.
Mise à jour 2
cela ne fonctionne pas non plus, il va dans ce morceau de code avant SubmitChanges et semble fonctionner, mais le sql de mise à jour généré a toujours la valeur tronquée, pas updated arrondi valeur.
partial void OnMy_Property_Name_ChangingChanging(decimal? value)
{
if (!value.HasValue)
{
return;
}
value =
Math.Round(value.Value, 2, MidpointRounding.AwayFromZero);
}
Le correctif que j'ai pour le moment est simplement de mettre à jour la valeur de l'entité directement.
si je mets à jour la base de données directement avec 23.63636363636363 alors il devient 23.64 .... ce qui est ok. Si je redéfinis la propriété, alors cela réparerait cette propriété mais c'est un gros db avec beaucoup de 15,2 champs définis ... Je ne veux pas vraiment faire ça pour tous. Je pense que si c'est un bug de Linq 2 Sql, il aurait été trouvé avant? (merci pour la réponse) –
Je suggère de creuser dans les internes de linq2sql en utilisant un réflecteur si vous vous sentez confiant à ce sujet. Évidemment, c'est quelque chose à propos du générateur de requêtes. –