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

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

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

Данные моей саги выглядят так,

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

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

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

Кто угодно?


person Per    schedule 06.10.2011    source источник


Ответы (1)


Я думаю, вам придется создать собственный диалект для NHibernate, если вы хотите изменить способ отображения десятичных знаков по умолчанию. Например, если вы используете SQL-сервер, посмотрите 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)

or

<property name="dialect">MyAssembly.MyCustomDecimalDialect, MyAssembly</property>
person Scott Dowding    schedule 06.10.2011
comment
Что ж, это единственное решение? На самом деле я надеялся только добавить атрибут к моему свойству ... Поскольку NHibernate инкапсулирован в NServiceBus, я надеялся на лучшее решение, чем переход к исходному коду NHibernate .... или просто изменение типа данных в Sql Server, которое я пробовал с успехом. - person Per; 06.10.2011
comment
Вы не можете определить сопоставление столбцов с помощью атрибутов только с помощью NHibernate. Ваше решение по изменению типа данных вручную будет работать, но оно решает проблему, когда nservicebus / nhibernate создает таблицу для вас. - person Scott Dowding; 12.10.2011