我第一次使用 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
答案 0 :(得分:12)
首先,您对Precision
和Scale
的理解是错误的。 Precision
始终高于Scale
。有关更好的理解,请参阅this MSDN documentation,其中说明:
精度是a中的位数 数。比例是位数 在小数点右边的一个 数。例如,数字123.45 精度为5,刻度为2。
在您的第二个示例中,即Decimal(18,0)
,0为Scale
,而非Precision
。 Precision
是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