2009-11-04 60 views
0

我们已经有一个庞大的系统,它通过Unity松散地绑定到它的数据源(Navision) - 我们有机会将它交换出来并拥有自己的数据库。获取NHibernate生成一个HiLo字符串ID

所以我们看了一下,非常喜欢Fluent NHibernate的外观 - 我们试图获得一个概念证明,并且交换出一些服务。

我们想要使用NHibernates HiLo算法 - 不幸的是,我们已经从Navision继承了字符串ID,它的ID为前缀(例如COL00001),以便匹配我们需要使用字符串ID的接口。

有谁知道我怎么会得到这样的事情......

Id(x => x.ID).GeneratedBy.HiLo("100"); 

工作,其中ID是一个字符串?目前,我们正在越来越认同必须的int,long等

感谢,

安迪

------更新------

我试图在该示例文章建议,但是这个功能已经从Fluent NHibernate的后续版本中删除 - 然而有一个.Custom - 但我似乎无法让它工作!

​​

回答

5

终于解决了......感谢您的帮助 - 在这里就是在情况下,解决任何人的兴趣......

注:,在Configure方法IType必须被传递到基部作为int

public class ManufacturerMap : ClassMap<Manufacturer> 
{ 
    public ManufacturerMap() 
    { 
     Id(x => x.ID).GeneratedBy.Custom<StringTableHiLoGenerator>(a => a.AddParam("max_lo", Nexus3General.HiLoGeneratorMaxLoSize.ToString())); 
     Map(x => x.Name); 
    } 
} 

public class StringTableHiLoGenerator : TableHiLoGenerator 
{ 
    public override object Generate(ISessionImplementor session, object obj) 
    { 
     return base.Generate(session, obj).ToString(); 
    } 

    public override void Configure(IType type, System.Collections.Generic.IDictionary<string, string> parms, NHibernate.Dialect.Dialect dialect) 
    { 
     base.Configure(NHibernateUtil.Int32, parms, dialect); 
    } 
} 
4

我不认为你会设法得到标准的HiLo发生器使用字符串。看看创建一个自定义的id生成器(这可能是一个字符串希洛):

http://nhforge.org/wikis/howtonh/creating-a-custom-id-generator-for-nhibernate.aspx

更新关于更新

我找不到这方面的任何适当的文件流利的维基。虽然你可以尝试这种通用方法,而不是你正在使用的方法:

Id(x => x.Id).GeneratedBy.Custom<IdentityGenerator>() 

这是否行得通?如果不是我想如果你发布流利,NHibernate的邮件列表中最快的响应可能出现:

http://groups.google.com/group/fluent-nhibernate

+0

感谢您的帮助,但请参阅此问题的更新 - 本文引用了现在已从Fluent中删除的方法。 – 2009-11-04 17:51:21

0

张贴的答案还曾在我的情况下我有一个字符串作为主键使用自定义ID生成和Nhiberate被扔的错误: “类型不是ValueTypeType 参数名:类型”。