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
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
Dipende da come hai dichiarato la proprietà 'Balance' nel tuo oggetto. Puoi pubblicare la dichiarazione dell'oggetto POCO? – Yogesh
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