2012-04-25 37 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的映射工作,這導致我相信這是一個與流利的問題。對於其他我可能錯過的任何建議?

感謝, 跳過

+0

如果使用小數而不是空數,會發生嗎? – Firo 2012-04-26 09:51:58

+0

@Firo - 與不可爲空的小數相同的問題。 – SkipHarris 2012-04-26 14:19:16

+1

那麼看到差異的唯一方法就是輸出FNH生成新的PersistanceModel(); model.Add(new Class1Map()); model.Write(Console.Out);' – Firo 2012-04-26 14:40:06

回答

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錯誤。