NHibernate:错误的列类型:找到浮点数,预期双精度

时间:2012-01-06 16:38:46

标签: nhibernate

我有一个带有属性的域实体类:

public virtual double? Result { get; set; }

使用NHibernate 3.2代码映射来映射属性:

public class SampleResultMap : ClassMapping<SampleResult>
{
    public SampleResultMap()
    {
        Id(c => c.Id,
            map => map.Generator(Generators.Identity));
        Property(c => c.Result, map =>
        {
            map.NotNullable(false);
        });
        // More properties, etc.
    }
}

这很好用,并且数据类型为float。

正确创建了SQL Server 2008 R2表

但是,SchemaValidator.Validate调用会出现此错误:

NHibernate.HibernateException was unhandled
Wrong column type in Foo.dbo.SampleResult for column Result.
Found: float, Expected DOUBLE PRECISION

查看对SchemaExport.Create的调用生成的SQL,该表有以下定义:

create table SampleResult (
        Id INT IDENTITY NOT NULL,
       DateEnteredUtc DATETIME not null,
       ElementId INT not null,
       Unit INT not null,
       ResultText NVARCHAR(50) null,
       [Result] DOUBLE PRECISION null,
       Detected BIT not null,
       Qualifier NVARCHAR(10) null,
       SampleId INT not null,
       Deleted BIT not null,
       primary key (Id)
    )

通过快速阅读NHibernate 3.2来源,验证者似乎正在将“DOUBLE PRECISION”与“float”进行比较。

有没有人见过这个?我认为这是一个错误,但我之前没有使用验证器,所以想知道我做错了什么。

1 个答案:

答案 0 :(得分:4)

我在SQLite数据库上遇到了类似的问题,这是因为SQLite只支持整数列的自动增量。

NHibernate已经正确地将ID列创建为整数,但是当它验证它时,它认为它应该是int而不是整数。因为int只是映射到SQLite上的整数我刚刚创建了一个新的方言来使用整数而不是int,它现在可以正常工作。

由于DOUBLE PRECISION与SQLServer上的FLOAT(53)相同,它可能是同一个东西,它看到浮点而不是双精度。作为一种解决方法,您可以尝试更改方言以使用FLOAT(53)代替:

using System.Data;
using NHibernate.Dialect;

public class UpdatedMsSql2008Dialect : MsSql2008Dialect
{
    public UpdatedMsSql2008Dialect()
        : base()
    {
        RegisterColumnType(DbType.Double, "FLOAT(53)");
    }
}

SQLServer dialect source似乎表明它应该有效。绝对看起来验证器有一个错误。