【问题标题】:NHibernate: Wrong column type: found float, expected double precisionNHibernate:错误的列类型:找到浮点数,预期双精度
【发布时间】:2012-09-06 02:17:34
【问题描述】:

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

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.
    }
}

这工作正常,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”进行比较。

还有其他人看过吗?我认为这是一个错误,但我之前没有使用过验证器,所以想看看我是否做错了什么。

【问题讨论】:

  • 一开始你说你将它声明为double?。所以是双倍还是浮动?
  • 它是一个 C# double?,作为可空的 float 列存储在 SQL Server 中;这些都是双精度表示。我知道,这很令人困惑,SQL Server real 是 C# float,它们都是单精度值。
  • 有什么解决方案吗?我遇到了同样的问题...
  • 不幸的是,没有。我试图将这个问题发布到 nhusers 和 nhibernate-development Google 组,但组版主从未接受他们发布。去图吧。

标签: nhibernate


【解决方案1】:

我在 SQLite DB 上原生生成的 ID 也有类似的问题,这是因为 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 似乎表明它应该可以工作。不过,看起来验证器确实存在错误。

【讨论】:

  • 是的。双精度映射到 MS SQL Server 上的 float(53)。从服务器读回元数据时,它会将数据类型报告为浮点数。 (nhibernate.jira.com/browse/NH-2655)
猜你喜欢
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 2021-08-11
  • 2011-07-12
  • 2013-12-27
相关资源
最近更新 更多