2012-01-06 11 views
4

Iプロパティとドメインエンティティクラスがある: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のデータ型で正しく作成されます。

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) 
    ) 

の迅速な読書から:SchemaExport.Createへの呼び出しは、テーブルのこの定義がある生成SQLを見てみると

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

しかし、SchemaValidator.Validate呼び出しがこのエラーを与えますNHibernate 3.2のソースは、バリデータが "DOUBLE PRECISION"と "float"を比較しているようです。

他にもこれを見ましたか?私はそれがバグだと仮定しますが、私は何かが間違っているかどうかを知りたいと思う前に、バリデータを使用していません。

+0

最初は「ダブル」と宣言しています。だから、それは二重か浮きですか? –

+0

これはC# 'double?'であり、SQL Serverにはヌル可能な 'float'カラムとして格納されています。これらは両方とも倍精度表現です。わかりました、それは混乱しています、SQL Serverの 'real'は単精度値であるC#' float'です。 – gdoten

+0

これに関する解決策はありますか?私は同じ問題に遭遇しています... – mCasamento

答えて

4

SQLiteは整数列の自動インクリメントしかサポートしていないため、SQLite DB上にネイティブに生成されたIDで同様の問題が発生しました。

NHibernateはID列を整数として正しく作成しましたが、検証時に整数ではなく整数である必要があると考えました。 intはSQLite上の整数にマップするだけなので、intの代わりに整数を使用する新しい方言を作成しました。

DOUBLE PRECISIONはSQLServer上のFLOAT(53)と同じですが、同じことになる可能性があります。倍精度ではなくfloatが表示されます。あなたの周りの仕事として代わりに(53)FLOATを使用する方言を変更してみてください:

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でfloat(53)にマップされます。サーバーからメタデータを読み込むと、データ型がfloatとしてレポートされます。 (https://nhibernate.jira.com/browse/NH-2655) –

関連する問題