NServiceBus: как мне расширить масштаб для десятичного столбца?

#nhibernate #nservicebus

#nhibernate #nservicebus

Вопрос:

Мы используем десятичные числа со шкалой из шести десятичных знаков, то есть 1,123456. Теперь, когда мы используем NServiceBus и нам нужно сохранить это значение в наших данных saga, у нас возникли проблемы.

Когда мы возвращаемся к саге и снова получаем наше значение, значение равно 1,12345. Я не нашел никого, у кого была бы такая же проблема, но я думаю, что это не может быть уникальным случаем.

Мои данные saga выглядят как,

 public class MySagaData : IContainSagaData
{
    public virtual Guid Id { get; set; }
    public virtual string Originator { get; set; }
    public virtual string OriginalMessageId { get; set; }
    public virtual int Property1 { get; set; }
    public virtual decimal Property2 { get; set; }
}
  

Дело в том, что когда Property2 равно 1,123456 и оно сохраняется в моей саге, возвращаюсь к саге и выбираю ее, тогда Property2 равно 1,12345.

Я знаю, почему это происходит, NHibernate создает поле базы данных, DECIMAL(19, 5) , но я не знаю, как решить мою проблему. Я не хочу создавать таблицу самостоятельно, но пусть NServiceBus сделает это за меня.

Кто-нибудь?

Ответ №1:

Я думаю, вам придется создать пользовательский диалект для NHibernate, если вы хотите изменить способ отображения десятичных знаков по умолчанию. Например, если вы используете SQL server, посмотрите на MsSql2000Dialect.cs в исходном коде Nhibernate. Вы можете видеть, что он определяет десятичный столбец следующим образом:

 RegisterColumnType(DbType.Decimal, "DECIMAL(19,5)");
  

Вы можете увидеть пример того, как это сделать здесь, в java. В C это в основном то же самое#
http://shashivelur.com/blog/2008/08/override-hibernate-sql-types-mapping /

После создания пользовательского диалекта вам просто нужно настроить его в конфигурации NHibernate:

 nhCibfig.SetProperty(Environment.Dialect, typeof(MyCustomDecimalDialect).AssemblyQualifiedName)
  

или

 <property name="dialect">MyAssembly.MyCustomDecimalDialect, MyAssembly</property>
  

Комментарии:

1. Ну, это единственное решение? На самом деле я надеялся только на добавление атрибута к моему свойству… Поскольку NHibernate инкапсулирован в NServiceBus, я надеялся на лучшее решение, чем переход к исходному коду NHibernate …. или просто изменение типа данных в Sql Server, что я и попробовал с успехом.

2. Вы не можете определить сопоставления столбцов, используя атрибуты только с помощью NHibernate. Ваше решение по изменению типа данных вручную будет работать, но оно решает проблему создания таблицы nservicebus / nhibernate для вас.