2013-02-19 13 views
5

Ich versuche zu verstehen, warum Entity Framework 4 auf zwei Dezimalstellen aufrundet, wenn im EF-Schemamodell und in der Datenbank die Genauigkeit auf 4 festgelegt ist.Entity Framework rundet auf zwei Dezimalstellen, wenn alles für vier Dezimalstellen festgelegt ist

das ist mein Schema-Definition für eine der Dezimalfeld:

SellPrice specify a scale of 19,4

Dies ist meine Datenbankdefinition

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

Wenn ich meine INSERT-Abfrage nach Berechnung des Verkaufspreises des Produkts ausführen, wie ich sehe, dass es

genug dezimal

SellPrice shows lots of decimals

Die Miniprofiler meine Abfrage zeigen und es zeigt, dass der Wert seine dezimal

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

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

Aber wenn ich den Microsoft SQL Profiler schauen durch, wird die SellPrice gerundet

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

Ich habe Probleme zu finden, wo der Wert gerundet wird.

+0

generieren Ist dieser Beitrag hilfreich? http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/c423a005-6a42-4f8d-aab6-e13fe3bdffba – mbeckish

Antwort

3

bei einer Vermutung, würde ich sagen, dass Ihr SQL-Datentyp money sein sollte, nicht decimal als decimal in C# ist nicht die gleiche wie decimal SQL. Insbesondere, wenn Sie sich die MSDN-Dokumentation (http://msdn.microsoft.com/en-us/library/ms187746.aspx) für den TSQL decimal Typ ist Staaten;

In Transact-SQL-Anweisungen wird eine Konstante mit einem Dezimalpunkt automatisch in einen numerischen Datenwert konvertiert, wobei die erforderliche Mindestgenauigkeit und Skalierung verwendet wird. Beispielsweise wird die Konstante 12.345 in einen numerischen Wert mit einer Genauigkeit von 5 und einem Maßstab von 3 konvertiert.

Die Konvertierung von Dezimal oder numerisch in Float oder Real kann zu einem gewissen Genauigkeitsverlust führen.

Es ist nicht explizit angegeben, dass dies die Ursache für Ihr Problem ist, aber ich nehme an, dass es ist. Vielleicht haben Sie mehr Glück mit dem money Datentyp als der, der am meisten entspricht und das ist auch, was die EF standardmäßig, wenn Sie das Modell aus einer vorhandenen DB

+2

Ich versuchte, die Felder zu Geld stattdessen zu setzen. Es funktioniert nicht. Ich habe auch versucht, ein anderes Entity Model zu machen, nur um zu sehen, wie sie es abbilden würden und es zeigt eine Precision von 19 und eine Skala von 4, aber der Sql Profiler zeigt immernoch Decimal (19,2). Es muss woanders sein, aber ich kann nicht wo finden. –

+1

@ Pierre-AlainVigeant, setzen Sie explizit die Skalierung und Genauigkeit oder werden diese automatisch für Sie eingestellt, wenn Sie versuchen, das EF-Diagramm/DB zu aktualisieren? Oder erstellen Sie zuerst die Datenbank oder das Modell? – DiskJunky

Verwandte Themen