获取NHibernate以生成HiLo字符串ID

时间:2009-11-04 14:47:03

标签: c# nhibernate fluent-nhibernate interface loose-coupling

我们有一个庞大的系统通过Unity与其数据源(Navision)松散绑定 - 我们有机会将其交换出来并拥有自己的数据库。

所以我们已经浏览了一下,并且非常喜欢Fluent NHibernate的外观 - 我们正试图获得概念验证并换掉一些服务。

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

有谁知道我会得到像......

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

在ID是字符串的地方工作?我们目前正在获取Identity必须是int,long等

谢谢,

安迪

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

我在文章建议中尝试了这个例子,但是这个功能已经从Fluent NHibernate的更高版本中删除了 - 但是有一个.Custom - 但我似乎无法让它工作!

public class ManufacturerMap : ClassMap<Manufacturer>
{
    public ManufacturerMap()
    {
        Id(x => x.ID).GeneratedBy.Custom(typeof(StringTableHiLoGenerator));
        Map(x => x.Name);
    }
}


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

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:4)

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

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

关于您更新的更新

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

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

这有用吗?如果不是,我认为如果您在fluent-nhibernate邮件列表上发帖,可能会得到最快的回复:

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

答案 2 :(得分:0)

发布的答案也适用于我的情况,我有一个字符串作为主键与自定义ID生成器和Nhiberate抛出错误: &#34; type不是ValueTypeType 参数名称:type&#34;。

相关问题