2013-03-06 110 views
3

我们正在研究分布式的顺序标识生成器,它可以创建一个96位的数字标识。我们在应用程序中为此值工作的数据类型是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

所以我想我可以编辑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" && [email protected] == 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),但我只使用了脚手架和可以只修复手动),但它的作品。