我有一种情况,在保存到数据库时十进制字段被截断为五位小数。即使我已经使用小数点后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的一个问题。关于我可能错过的其他事情的任何建议?
谢谢, 跳过
答案 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错误。