3

私たちは、96 ビットの数値 ID を作成する分散シーケンシャル ID ジェネレーターに取り組んでいます。この値のアプリケーションで使用するデータ型は ですdecimal。データベース側では、列のデータ型はdecimal(28,0).

問題は、コードでマップして Id を構成するときに、精度とスケールを指定できないことです。理想的には、次のようなものが必要です。

map.Id(c => c.Id, id =>
         {
             id.Generator(RustFlakeGeneratorDef.Instance);
             id.Precision(28); // nope
             id.Scale(0); // nope. *$%!
         });

それを無視しようとすると、NHibernate はパラメータを作成してコマンドを発行するときに使用に戻りdecimal(28,5)ますが、これは機能しません。

チケットがあることは承知しており、そのうちに貢献したいと思います。それまでの間、これがうまくいくかどうかを確認する必要があるため、これに対する回避策があるかどうか疑問に思っています. カスタム型、逆シリアル化された HBM のハック、そのようなものはありますか?

から派生する独自の型を作成しようとしましたが、独自の精度とスケールを指定DecimalTypeした を返すプロパティをオーバーライドしましたが、SqlType何も起こらなかったようです。

4

1 に答える 1

0

そのため、ByCode が作成し、マッピングを手動で更新する逆シリアル化された HBM マッピングを編集できると考えました。

var mapping = ModelMapper.CompileMappingFor(entityTypes);

// HACK: by code mapping doesn't support setting precision and scale, so fix flake ID columns here
var flakeTypeName = typeof (RustFlakeGenerator).AssemblyQualifiedName;

foreach (var id in (from root in mapping.RootClasses
                    where root.Id.Type.name == "Decimal" && root.Id.generator.@class == flakeTypeName
                    select root.Id))
{
    var column = id.column == null || !id.column.Any() ? new HbmColumn() : id.column.First();
    column.name = id.name;
    column.precision = "28";
    column.scale = "0";

    if (id.column == null || !id.column.Any()) id.column = new[] {column};
}

それは最悪で、SchemaExport などは精度とスケールを完全に無視します (デフォルトはdecimal(19,5)ですが、私はそれをスキャフォールディングにのみ使用し、手動で修正することができます) が、機能します。

于 2013-03-08T11:49:59.750 に答える