4

我有一个案例,当保存到数据库时,十进制字段被截断到小数点后五位。即使我以小数点后 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 的问题。关于我可能错过的其他事情的任何建议?

谢谢,跳过

4

1 回答 1

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 错误。

于 2012-04-27T20:39:10.747 回答