我们正在开发一个分布式的顺序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
的属性,在那里我指定了自己的精度和比例,但似乎没有做任何事。
答案 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)
,但我只将其用于脚手架,并且可以手动修复),但它可以正常工作。