0

我们有一个大型系统,它通过 Unity 松散地绑定到它的数据源(Navision)——我们有机会将它换掉并拥有我们自己的数据库。

因此,我们环顾四周,非常喜欢 Fluent NHibernate 的外观——我们正在尝试进行概念验证并更换一些服务。

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

有谁知道我怎么会得到类似...

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

在 ID 是字符串的地方工作?我们目前正在获取 Identity must be 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();
    }
}
4

3 回答 3

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);
    }
}
于 2009-11-05T16:07:23.013 回答
4

我认为您不会设法让标准的 HiLo 生成器与字符串一起工作。看看创建一个自定义 id 生成器(可以是带有字符串的 hilo):

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

更新关于你的更新

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

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

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

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

于 2009-11-04T14:50:26.757 回答
0

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

于 2015-01-21T09:12:10.457 回答