使用NHibernate 3.2和FluentNHibernate 1.3截断的十进制字段

时间:2012-04-25 21:08:27

标签: nhibernate fluent-nhibernate

我有一种情况,在保存到数据库时十进制字段被截断为五位小数。即使我已经使用小数点后10位的精度映射它们,也会发生这种情况。

我在SQL Server 2008中使用NHibernate 3.2.0.4000和FluentNHibernate 1.3.0.717。

这是我的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"/>

我删除了十进制字段的所有约定,但仍有问题。

由于基于XML的映射有效,这让我相信它是Fluent的一个问题。关于我可能错过的其他事情的任何建议?

谢谢, 跳过

1 个答案:

答案 0 :(得分: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错误。