NHibernate HiLo位于主键所在的其他列上

NHibernate HiLo位于主键所在的其他列上,nhibernate,Nhibernate,任何人都会遇到在主键以外的列上实现hilo类型解决方案的方法。有一个像jobno这样的列,我不想成为主键(使用guidcomb并对其满意),需要有一个序列号,并且不想点击数据库来获得下一个值。我不知道任何“开箱即用”的方法,但您可以创建一个NHibernate.Id.TableHilGenerator实例(NHibernate使用它生成id值)并使用它生成值。但是,您仍然需要手动设置实体的生成值 您也可以通过继承TableHiLoGenerator来创建自己的生成器: public class

任何人都会遇到在主键以外的列上实现hilo类型解决方案的方法。有一个像jobno这样的列,我不想成为主键(使用guidcomb并对其满意),需要有一个序列号,并且不想点击数据库来获得下一个值。

我不知道任何“开箱即用”的方法,但您可以创建一个NHibernate.Id.TableHilGenerator实例(NHibernate使用它生成id值)并使用它生成值。但是,您仍然需要手动设置实体的生成值

您也可以通过继承TableHiLoGenerator来创建自己的生成器:

public class MyHiLoGenerator : TableHiLoGenerator
{
    private readonly ISessionFactory _sessionFactory;

    public MyHiLoGenerator(ISessionFactory sessionFactory)
    {
        _sessionFactory = sessionFactory;
        Configure(NHibernateUtil.Int64, new Dictionary<string, string> {{"table", "mytable"}, {"column", "mycolumn"}}, ((SessionFactoryImpl) sessionFactory).Dialect);
    }

    public long NextValue()
    {
        return (long) Generate((ISessionImplementor) _sessionFactory.GetCurrentSession(), null);
    }
}
公共类MyHilGenerator:TableHilGenerator
{
私有只读ISessionFactory _sessionFactory;
公共MyHiLoGenerator(ISessionFactory sessionFactory)
{
_sessionFactory=sessionFactory;
配置(NHibernateUtil.Int64,新字典{{“table”,“mytable”},{“column”,“mycolumn”},((SessionFactoryImpl)sessionFactory).dialogue);
}
公共长下一个值()
{
返回(长)生成((ISessionImplementor)_sessionFactory.GetCurrentSession(),null);
}
}

这只是一个简单的例子,根本没有经过测试,但它仍然展示了如何使用TableHilGenerator。我自己也使用了类似的方法来生成HiLo值。

你能不能在DB中给它一个标识,当你提交记录时,你会得到#。谢谢@Phil,但“不想点击DB来获得下一个值”这就是Hiloa的重点,我不知道你为什么不想访问数据库。不访问数据库对你有什么好处?能够在持久化之前创建我的实体并访问该值。你不需要与其他实体共享JobNo。你用PK而不是JobNo引用它们。没有其他实体应该有JobNo,所以我仍然不明白为什么不能在提交时生成它。