9

Estoy trabajando por primera vez con FluentNHibernate, tratando de asignar clases a base de datos SQL Express. En general, funciona, pero no puedo asignar tipos de propiedad dobles o decimales a la escala/precisión específica. A continuación se muestra el resultado de una sola propiedad que probé una y otra vez con SchemaUpdate.Execute. En ningún caso fui capaz de hacer que funcione.Mapeo FluentNHibernate; No se puede asignar el doble o el decimal con escala/precisión

¿Sería realmente útil escuchar alguna explicación de las asignaciones que no funciona como espero (2-8)?

// Ok mappings: 

1) decimal: mapa (función (x) x.Balance) >> decimal (19, 5)

// Mappings "errors": 

2) Doble: Mapa (Función (x) xBalance) .CustomSqlType ("decimal") >> Decimal (18,0) - ¿Por qué 0 la precisión es la asignación predeterminada aquí?

3) Doble: mapa (función (x) x.Balance) >> flotador, Pero; al ejecutar SchemaValidator después de: HibernateException: Tipo de columna incorrecta en FnhDb.dbo.Cuenta para la columna Balance. Encontrado: flotador, que se espera PRECISION DOBLE

4) decimal: Mapa (función (x) x.Balance) .Scale (9) .precision (2) >> SqlException: La escala (9) para la columna 'Saldo' debe estar dentro del rango de 0 a 2.

5,6) decimal o doble: mapa (función (x) x.Balance) .Scale (9) .precision (2). CustomSqlType ("numérico") >> numérico (18,0)

7,8) decimal o doble: mapa (función (x) x.Balance) .Scale (9) .precision (2) .CustomSqlType ("decimal") >> decimal (18,0)


EDIT: que incluyen código y hbm.xml (exportación) para el caso (4) aquí:

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:

Por cierto, esto no es un problema VB. Tengo exactamente el mismo problema en un proyecto C#.¿Puede ser la configuración MsSql2008 que no es compatible con Sql Express 2008 R2?


Edit3:

Option Strict On 

importaciones System.Collections.Generic importaciones 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 

Respuesta

12

En primer lugar, su comprensión de Precision y es Scale incorrecto. Precision es siempre más alto que Scale. Ver this MSDN documentation para una mejor comprensión, que establece:

precisión es el número de dígitos de un número . La escala es el número de dígitos a la derecha del punto decimal en un número . Por ejemplo, el número 123,45 tiene una precisión de 5 y una escala de 2.

En su segundo ejemplo, es decir Decimal(18,0), 0 es Scale, no Precision. Precision es 18.

En segundo lugar, el mapeo debe ser la siguiente:

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

Si establece CustomSqlType("decimal") después de establecer Precision y Scale, los ajustes realizados por usted serán restablecidos.

EDIT:
está usando el double en la declaración, en la que creo que debe utilizar decimal. Consulte this question para saber por qué. double es una variable flotante, por lo que se asigna a float de forma predeterminada hasta que indique lo contrario o hasta que Precision sea mayor que 7. Si cambia la declaración de Balance a decimal, puede asignar la propiedad de esta manera sin ningún problema:

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

Ai .. ¡Gracias! Comprobé esto exactamente (Def. De precisión/escala), pero también lo he leído mal ... Bueno, eso me deja con una sola pregunta: ¿Cómo es que no puedo mapear un doble a Decimal/¿numérico? Como siempre creará una (18,0) columna? – bretddog

+0

Depende de cómo haya declarado la propiedad 'Balance' en su objeto. ¿Puedes publicar la declaración del objeto POCO? – Yogesh

+0

Ok, agregué toda la clase anterior. Y ahora mapear como dijiste: Mapa (Función (x) xBalance) .CustomSqlType ("decimal"). Precisión (9) .Scale (2) – bretddog

Cuestiones relacionadas