2012-01-06 74 views
4

我有個域實體類與屬性: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. 
    } 
} 

這工作正常,SQL Server 2008 R2表正確創建與數據類型的float。

然而,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」。

有沒有其他人看到過這個?我認爲這是一個錯誤,但我還沒有使用驗證器之前,所以想知道如果我做錯了什麼。

+0

一開始你說你宣稱它是'double?'。那麼它是雙重還是浮動? – 2012-01-06 16:56:37

+0

它是一個C#'double?',它存儲在SQL Server中作爲可爲空的'float'列;這些都是雙精度表示。我知道,這很讓人困惑,一個SQL Server'real'是一個C#'float',它們都是單精度值。 – gdoten 2012-01-06 17:55:54

+0

任何解決方案?我遇到了同樣的問題... – mCasamento 2012-02-20 13:35:02

回答

4

我有一個SQLite數據庫上的本機生成的ID的類似問題,這是由於SQLite只支持整數列上的自動增量而導致的。

NHibernate已經正確創建了ID列作爲一個整數,但是當它驗證它時,它認爲它應該是一個int而不是一個整數。因爲int只是映射到SQLite上的整數,我只是創建了一個新的方言來使用整數而不是整數,現在它工作正常。

由於DOUBLE PRECISION與SQLServer上的FLOAT(53)相同,它可能是同樣的事情,它看到float而不是雙精度。作爲一個工作,你身邊可以嘗試改變方言使用FLOAT(53),而不是:

using System.Data; 
using NHibernate.Dialect; 

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

SQLServer dialect source似乎表明它應該工作。絕對看起來像驗證器有一個錯誤。

+0

是的。雙精度映射在MS SQL Server上浮動(53)。當從服務器讀回元數據時,它將數據類型報告爲float。 (https://nhibernate.jira.com/browse/NH-2655) – 2012-10-06 08:59:40