有一些重载:
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? table
和column
的目的是什么?
基于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");
}
}
答案 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更容易。