获取NHibernate以生成HiLo字符串ID

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取NHibernate以生成HiLo字符串ID相关的知识,希望对你有一定的参考价值。

我们有一个庞大的系统通过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();
    }
}
答案

最后破解了它...感谢您的帮助 - 这是解决方案以防任何人感兴趣...

注意:在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);
    }
}
另一答案

我认为你不会设法让标准的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

另一答案

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

以上是关于获取NHibernate以生成HiLo字符串ID的主要内容,如果未能解决你的问题,请参考以下文章

Nhibernate id 具有连续一步递增的 id(HiLo 的替代品)

Fluent NHibernate - HiLo 方案的 PersistenceSpecification

如何在运行时从 nhibernate 映射文件生成实体类

重新映射 NHibernate ID 生成

Nhibernate:发生异常的 id 获取器

插入 nhibernate sql server 后无法检索生成的 id