#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 для вас.