9

Sto lavorando per la prima volta con FluentNHibernate, cercando di associare le classi al database SQL Express. In generale funziona, ma non sono in grado di mappare i tipi di proprietà Double o Decimal su specifica scala/precisione. Di seguito viene mostrato il risultato per una singola proprietà che ho testato più e più volte con SchemaUpdate.Execute. In nessun caso sono riuscito a farlo funzionare.FluentNHibernate mapping; Impossibile mappare il doppio o il decimale con scala/precisione

Sarebbe davvero utile ascoltare qualche spiegazione ai mapping che non funziona come previsto (2-8)?

// Ok mappings: 

1) Decimale: Mappa (function (x) x.Balance) >> decimale (19, 5)

// Mappings "errors": 

2) Doppio: Mappa (Funzione (x) x.Balance). CustomSqlType ("decimale") >> Decimale (18,0) - Perché 0 la precisione è la mappatura predefinita qui?

3) Doppio: Mappa (function (x) x.Balance) >> Float, Ma; quando si esegue SchemaValidator dopo: HibernateException: Tipo di colonna errato in FnhDb.dbo.Account per la colonna Saldo. Trovato: float, prevista DOPPIO DI PRECISIONE

4) Decimale: Mappa (function (x) x.Balance) .Scale (9) .precision (2) >> SqlException: La scala (9) per la colonna 'Balance' deve essere compreso tra 0 e 2.

5,6) decimale o doppio: Mappa (function (x) x.Balance) .Scale (9) .precision (2). CustomSqlType ("numerico") >> numerico (18,0)

7,8) Decimale o doppio: Mappa (function (x) x.Balance) .Scale (9) .precision (2) .CustomSqlType ("decimali") >> decimale (18,0)


EDIT: I includere il codice e hbm.xml (esportazione) per il caso (4) qui:

Public Class AccountMap 
    Inherits ClassMap(Of Account) 

    Public Sub New() 
     MyBase.New() 

     Id(Function(x) x.Id).GeneratedBy.Identity() 
     Map(Function(x) x.Balance).Scale(9).Precision(2) 
     Map(Function(x) x.Deposits) 
     Map(Function(x) x.WithDrawals) 
    End Sub 
End Class 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="false"> 
    <class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="RoboTrader.Account, RoboTrader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Account`"> 
    <id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Id" /> 
     <generator class="identity" /> 
    </id> 
    <property name="Balance" type="System.Decimal, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Balance" precision="2" scale="9" /> 
    </property> 
    <property name="Deposits" type="System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Deposits" /> 
    </property> 
    <property name="WithDrawals" type="System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="WithDrawals" /> 
    </property> 
    </class> 
</hibernate-mapping> 

EDIT2:

Btw, questo non è un problema VB. Ho lo stesso identico problema in un progetto C#.Può essere la configurazione MsSql2008 non compatibile con Sql Express 2008 R2?


Edit3:

Option Strict On 

Importazioni System.Collections.Generic Imports System.Text Imports System

Public Class Account 
    Public Sub New() 
     MyBase.New() 
End Sub 

Private _Id As Integer 

Private _Balance As Double 

Private _Deposits As Integer 

Private _WithDrawals As Integer 


Public Overridable Property Id() As Integer 
    Get 
     Return _Id 
    End Get 
    Set(ByVal value As Integer) 
     _Id = value 
    End Set 
End Property 
Public Overridable Property Balance() As Double 
    Get 
     Return _Balance 
    End Get 
    Set(ByVal value As Double) 
     _Balance = value 
    End Set 
End Property 
Public Overridable Property Deposits() As Integer 
    Get 
     Return _Deposits 
    End Get 
    Set(ByVal value As Integer) 
     _Deposits = value 
    End Set 
End Property 
Public Overridable Property WithDrawals() As Integer 
    Get 
     Return _WithDrawals 
    End Get 
    Set(ByVal value As Integer) 
     _WithDrawals = value 
    End Set 
End Property 




End Class 

risposta

12

Prima di tutto, la vostra comprensione della Precision e Scale è sbagliato. Precision è sempre superiore a Scale. Vedere this MSDN documentation per una migliore comprensione, in cui si afferma:

precisione è il numero di cifre in un numero . La scala è il numero di cifre a destra del punto decimale in un numero . Ad esempio, il numero 123,45 ha una precisione di 5 e una scala di 2.

Nel secondo esempio, cioè Decimal(18,0), 0 è Scale, non Precision. Precision è 18.

In secondo luogo, la mappatura dovrebbe essere questo:

Map(Function(x) x.Balance).CustomSqlType("decimal").Precision(9).Scale(2); 

Se si imposta CustomSqlType("decimal") dopo aver impostato Precision e Scale, le impostazioni effettuate dall'utente verranno ripristinate.

EDIT:
Si utilizza double nella dichiarazione, in cui penso che si dovrebbe usare decimal. Vedi this question per sapere perché. double è una variabile di tipo flottante quindi è associata a una float di default fino a quando si parla altrimenti o fino a quando il Precision è superiore a 7. Se si modifica la dichiarazione di Balance a decimal, è possibile mappare la proprietà come questa senza problemi:

Map(Function(x) x.Balance).Precision(9).Scale(2) 
+0

Ai .. Grazie! Ho controllato questa cosa esatta (Def. Di precisione/scala), ma devo averlo letto male anche allora .. Beh, questo mi lascia con una sola domanda: come mai non sono in grado di mappare un doppio al decimale/numerico? Come creerà sempre una colonna (18,0)? – bretddog

+0

Dipende da come hai dichiarato la proprietà 'Balance' nel tuo oggetto. Puoi pubblicare la dichiarazione dell'oggetto POCO? – Yogesh

+0

Ok, ho aggiunto l'intera classe sopra. E ora la mappatura come hai detto: Mappa (Funzione (x) x.Balance). CustomSqlType ("decimal"). Precision (9) .Scale (2) – bretddog

Problemi correlati