设置小数标识符的比例和精度

时间:2013-03-06 18:24:44

标签: c# nhibernate nhibernate-mapping mapping-by-code

我们正在开发一个分布式的顺序ID生成器,它可以创建一个96位的数字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),这将无效。

我知道有一个ticket,如果我想在适当的时候为此做出贡献。与此同时,我需要看看是否会出现这种情况,所以我想知道是否有任何解决方法。自定义类型,破解反序列化的HBM,类似的东西?

我确实尝试创建自己的DecimalType派生类型,并且我覆盖了返回SqlType的属性,在那里我指定了自己的精度和比例,但似乎没有做任何事。

1 个答案:

答案 0 :(得分: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),但我只将其用于脚手架,并且可以手动修复),但它可以正常工作。

相关问题