FluentNHibernate映射;无法使用比例/精度映射双精度或小数

时间:2011-01-31 00:00:48

标签: .net database nhibernate fluent-nhibernate nhibernate-mapping

我第一次使用 FluentNHibernate ,尝试将类映射到 SQL Express 数据库。通常它可以工作,但我无法将 Double或Decimal 属性类型映射到特定的 scale / precision 。下面显示了我使用 SchemaUpdate.Execute 反复测试的单个属性的结果。在任何情况下我都无法让它发挥作用。

听到一些不符合我预期的映射的解释(2-8)会非常有帮助吗?

// Ok mappings:

1)十进制:地图(函数(x)x.Balance)>> 十进制(19,5)

// Mappings "errors":

2)Double :Map(Function(x)x.Balance).CustomSqlType(“decimal”)>> Decimal(18,0) - 为什么0精度是这里的默认映射?

3)Double :Map(Function(x)x.Balance)>> Float, 但;在运行 SchemaValidator 之后:   HibernateException :列平衡的FnhDb.dbo.Account中的列类型错误。发现:浮动,预期双精度

4)十进制:地图(函数(x)x.Balance).Scale(9)。精度(2)>> SqlException :“余额”列的比例(9)必须在0到2的范围内。

5,6)十进制或双精度:映射(函数(x)x.Balance).Scale(9)。精度(2).CustomSqlType(“numeric”)> > 数字(18,0)

7,8)十进制或双精度:映射(函数(x)x.Balance).Scale(9)。精度(2).CustomSqlType(“decimal”)> > 十进制(18,0)


修改 我在这里包含代码和案例(4)的hbm.xml(export):

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:

顺便说一句,这不是 VB 问题。我在 C#项目中遇到了完全相同的问题。是否 MsSql2008配置 Sql Express 2008 R2 不兼容?


EDIT3:

Option Strict On

Imports System.Collections.Generic 导入System.Text 进口系统

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

1 个答案:

答案 0 :(得分:12)

首先,您对PrecisionScale的理解是错误的。 Precision始终高于Scale。有关更好的理解,请参阅this MSDN documentation,其中说明:

  

精度是a中的位数   数。比例是位数   在小数点右边的一个   数。例如,数字123.45   精度为5,刻度为2。

在您的第二个示例中,即Decimal(18,0),0为Scale,而非PrecisionPrecision是18。

其次,你的映射应该是这样的:

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

如果您在设置CustomSqlType("decimal")Precision后设置Scale,则您将完成设置。

修改
您在声明中使用double,我认为您应该使用decimal。请参阅this question以了解原因。 double是一个浮动类型变量,因此默认情况下它会映射到float,直到您提及或Precision高于7.如果您更改{{1}的声明} Balance,你可以毫无问题地映射这个属性:

decimal