FluentNHibernate картографирование;Невозможно отобразить двойное или десятичное с масштабом / точностью - PullRequest
9 голосов
/ 31 января 2011

Я впервые работаю с FluentNHibernate , пытаюсь сопоставить классы с базой данных SQL Express .В целом это работает, но я не могу сопоставить Double или Decimal типы свойств с определенными scale / precision .Ниже показан результат для отдельного свойства, которое я проверял снова и снова с SchemaUpdate.Execute .Ни в коем случае я не смог заставить его работать.

Было бы действительно полезно услышать некоторые объяснения отображений, которые не работают, как я ожидаю (2-8)?

// Ok mappings:

1) Десятичное число : Карта (Функция (x) x Баланс) >> Десятичное число (19, 5)

// Mappings "errors":

2) Double : карта (функция (x) x.Balance) .CustomSqlType ("десятичное число") >> десятичное число (18,0) - почему точность по умолчанию равна 0отображение здесь?

3) Double : карта (функция (x) xBalance) >> Float, But;при запуске SchemaValidator после: HibernateException : неверный тип столбца в FnhDb.dbo.Account для столбца Balance.Найдено: число с плавающей запятой, ожидаемая ДВОЙНАЯ ТОЧНОСТЬ

4) Десятичное число : Карта (Функция (x) x Баланс). Масштаб (9). Точность (2) >> SqlException : Шкала (9) для столбца «Баланс» должна находиться в диапазоне от 0 до 2.

5,6) Десятичный или двойной : Карта (Функция (x) x.Balance). Scale (9) .Precision (2) .CustomSqlType ("numeric") >> numeric (18,0)

7,8) Десятичное или двойное : Карта (Функция (x) x Баланс). Масштаб (9). Точность (2) .CustomSqlType ("десятичное") >> Десятичное число (18,0)


РЕДАКТИРОВАТЬ: Я включаю код и hbm.xml (экспорт) для дела (4) здесь:

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 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

1 Ответ

12 голосов
/ 31 января 2011

Прежде всего, ваше понимание Precision и Scale неверно. Precision всегда выше, чем Scale. См. эту документацию MSDN для лучшего понимания, которая гласит:

Точность - это количество цифр в число. Масштаб это количество цифр справа от десятичной точки в число. Например, число 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, выполненные вами настройки будут сброшены.

EDIT:
Вы используете double в декларации, где я думаю, что вы должны использовать decimal. См. этот вопрос , чтобы узнать почему. double - это переменная плавающего типа, поэтому по умолчанию она отображается на float, пока не будет указано иное, или пока Precision не станет больше 7. Если вы измените объявление Balance на decimal, вы можете без проблем сопоставьте недвижимость:

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