你能解释一下GeneratedBy.HiLo(...)的论点吗?

时间:2011-08-18 03:06:53

标签: nhibernate fluent-nhibernate

有一些重载:

GeneratedBy.HiLo(string maxLo);
GeneratedBy.HiLo(string maxLo, Action<ParamBuilder> paramValues);
GeneratedBy.HiLo(string table, string column, string maxLo);
GeneratedBy.HiLo(string table, string column, string maxLo, string where);
GeneratedBy.HiLo(string table, string column, string maxLo, Action<ParamBuilder> paramValues);

我从概念上理解hi / lo算法的作用。但这些参数做什么?我在Hibernate中找不到他们实际做的文档。

maxLo应该是名字还是数字?什么是paramValues? tablecolumn的目的是什么?

基于NHibernate入门教程的示例用法:

public class StoreMap : ClassMap<Store>
{
    public StoreMap()
    {
        Id(x => x.Id).GeneratedBy.HiLo("something");
        Map(x => x.Name);
        HasMany(x => x.Staff)
            .Inverse()
            .Cascade.All();
        HasManyToMany(x => x.Products)
            .Cascade.All()
            .Table("StoreProduct");
    }
}

1 个答案:

答案 0 :(得分:7)

maxLo是HiLo的Lo值。

根据插入表中的频率,您应该将值指定为10,100或1000.如果将值指定为10,NHibernate将从数据库中获取Hi值并使用低值生成希洛。

如果经常插入,则应指定高Lo(例如100或1000),如果插入较少,则应指定低Lo。这是因为每次创建会话工厂时都会从数据库中提取新的Hi值。如果您当前的Hi为5,Lo为100,并且已插入100个项目中的13个,并且您创建了一个新的会话工厂(从重新启动网站或应用程序),那么它将获得一个新的Hi of 6,并且您将有513到600之间的差距

因此,如果您的Hi目前是3,那么它将生成从31到40的值。同样,如果您的Lo为1000,它将生成从3001到4000的值。

其他参数允许您指定存储Hi值的表。默认情况下,如果NHibernate配置为创建/更新数据库,它将为您生成此表,但参数允许您自己设置表。

我刚刚写了一篇博文,其中显示了每个Hi的列,以及每个Hi的行。

http://www.philliphaydon.com/2010/10/24/using-hilo-with-fluentnhibernate/

编辑:Lo的行为,例如7

HiLo计算为一系列数字,例如,如果我们的Hi为3,Lo为10,则范围介于:

3 * 10 = 30 至3 * 10 + 10 = 40

所以会话工厂的范围是30到40,当你要求对象的Id时,它会抓取它的当前值(30)并添加1.所以Id = 31.下一个对象需要31+ 1 = 32.这发生在它达到40之前,此时它会进入数据库并要求下一个Hi。

如果您有两个Web服务器,则第二个Web服务器可能要求下一个Hi为4,这意味着第一个Web服务器将获得5个。

所以你的下一个范围是50到60。


如果Lo为7,我们会得到:

0 * 7 = 0 / 0 * 7 + 7 = 7 = 1-7

1 * 7 = 7 / 1 * 7 + 7 = 14 = 8-14

2 * 7 = 14 / 2 * 7 + 7 = 21 = 15-21

所以它仍然有效。

但我个人认为使用整个值10,100,1000更容易。