2012-04-25 3 views
4

У меня есть случай, когда десятичные поля усекаются до пяти десятичных знаков при сохранении в базе данных. Это происходит даже при том, что я сопоставил их с точностью 10 мест после десятичного числа.Десятичные поля, усеченные с NHibernate 3.2 и FluentNHibernate 1.3

Я использую NHibernate 3.2.0.4000 и FluentNHibernate 1.3.0.717 с SQL Server 2008.

Вот мой C# свойство:

public virtual decimal? MyDecimalField { get; set; } 

Я пытался делать в авто отображение переопределение:

mapping.Map(x => x.MyDecimalField).Precision(28).Scale(10); 

Я также попытался сделать явное отображение поля:

Map(x => x.MyDecimalField).Precision(28).Scale(10); 

При выполнении экспорта схемы, таблица будет создаваться правильно:

create table MyTable (
    Id UNIQUEIDENTIFIER not null, 
    MyDecimalField DECIMAL(28, 10) null, 
    primary key (Id) 
) 

Используя значение 5.1234567890, вот фрагменты параметров из генерируемого обновления заявления SQL:

@p31 decimal(28,5) 
@p31=5.12345 

Я чтобы сделать эту работу корректной, если я использую XML-сопоставление:

<property name="Decimal01" precision="28" scale="10"/> 

Я удалил все conventi ons для десятичных полей и все еще есть проблема.

Поскольку работа на основе XML основана, это заставляет меня думать, что это проблема с Fluent. Любые предложения о чем-то еще, что я, возможно, пропустил?

Спасибо, Пропустить

+0

это происходит, если вы используете десятичное значение вместо нулевого ? – Firo

+0

@Firo - та же проблема с десятичной точкой с нулевым значением. – SkipHarris

+1

, тогда единственный способ увидеть разницу - вывести то, что FNH генерирует 'new PersistanceModel(); model.Add (новый Class1Map()); model.Write (Console.Out); ' – Firo

ответ

3

Я собираюсь ответить на мой собственный вопрос здесь. Спасибо @Firo за то, что он дал мне несколько советов, которые указали мне на решение.

У меня есть соглашение, чтобы установить длину по умолчанию для моих строковых полей:

public void Apply(IPropertyInstance instance) 
    { 
     instance.Length(350); 
    } 

Но мои критерии приемки не исключает десятичных полей. Я добавил некоторые критерии приемлемости для исключения десятичных знаков:

public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
     criteria 
      .Expect(x => x.Type != typeof(decimal) && x.Type != typeof(decimal?)); 
    } 

Выполнение этой корректировки моей десятичной точности.

Что интересно, моя длина строки по умолчанию 350 не отображается в моих экспортированных файлах сопоставления XML для десятичных полей. Но похоже, что FNH все еще его использовал. Это кажется ошибкой FNH для меня.

Смежные вопросы