4

データベースに保存するときに、小数フィールドが小数点以下 5 桁に切り捨てられる場合があります。これは、小数点以下 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 に問題があると思われます。私が見逃したかもしれない何か他の提案はありますか?

ありがとう、スキップ

4

1 に答える 1

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 が、10 進フィールド用にエクスポートした XML マッピング ファイルに表示されなかったことです。しかし、FNHはまだ何らかの形でそれを使用していたようです. これは、FNH のバグのように思えます。

于 2012-04-27T20:39:10.747 に答える