带有事务的NHibernate自定义IIIdentifierGenerator

带有事务的NHibernate自定义IIIdentifierGenerator,nhibernate,Nhibernate,一个简单的问题,我可以这样做吗: (我不知道有什么替代方法,因为NHibernate不支持嵌套事务) 或者这是我不应该做的事情,如果是,为什么不呢?你可以试试这样的事情 public class GetNextSequence : IIdentifierGenerator, IConfigurable { private string _item; public object Generate(NHibernate.Engine.ISessionImpl

一个简单的问题,我可以这样做吗:

(我不知道有什么替代方法,因为NHibernate不支持嵌套事务)


或者这是我不应该做的事情,如果是,为什么不呢?

你可以试试这样的事情

public class GetNextSequence : IIdentifierGenerator, IConfigurable
    {
        private string _item;

        public object Generate(NHibernate.Engine.ISessionImplementor session, object obj)
        {
            using (var nSession = SessionFactoryWrapper.SessionFactory.OpenSession())
            {
                using( var tran = nSession.BeginTransaction(System.Data.IsolationLevel.Serializable))
                {
                    var update = nSession.CreateSQLQuery("update counter set last_one = last_one + 1 where item like :item");
                    update.SetParameter("item", _item);

                    update.ExecuteUpdate();

                    var query = nSession.CreateSQLQuery("SELECT last_one FROM counter WHERE item LIKE :item");
                    query.SetParameter("item", _item);
                    var lastOne = query.UniqueResult();

                    tran.Commit();
                    return lastOne;
                }
            }
        }

        public void Configure(NHibernate.Type.IType type, IDictionary<string, string> parms, NHibernate.Dialect.Dialect dialect)
        {
            parms.TryGetValue("item", out _item);
        }
    }
公共类GetNextSequence:IIIdentifierGenerator,可配置
{
私有字符串_项;
公共对象生成(NHibernate.Engine.ISessionImplementor会话,对象obj)
{
使用(var nSession=SessionFactoryWrapper.SessionFactory.OpenSession())
{
使用(var tran=nSession.BeginTransaction(System.Data.IsolationLevel.Serializable))
{
var update=nSession.CreateSQLQuery(“更新计数器集last\u one=last\u one+1,其中项类似于:item”);
update.SetParameter(“项”,_项);
update.ExecuteUpdate();
var query=nSession.CreateSQLQuery(“从计数器中选择最后一个项目,如:item”);
query.SetParameter(“项”,_项);
var lastOne=query.UniqueResult();
trans.Commit();
返回最后一个;
}
}
}
public void配置(NHibernate.Type.IType类型、IDictionary参数、NHibernate.dialogue.dialogue)
{
参数TryGetValue(“项目”,不含项目);
}
}

这看起来非常像希洛。你不能用它来代替吗?是的,也许我需要使用这个表并增加计数器+1,我需要确保没有人可以读取旧的计数器值!这在Hilo中是可能的吗?是的,这正是Hilo的特点,而且它给您带来了额外的好处。您使用的映射类型是什么?XML fluent或代码映射,我将发布一个答案您是否有其他外部系统也使用此表?是的,我有外部系统使用此表,是否可以确保他们使用Hilo获得正确的密钥?我正在使用流畅的映射和XML进行StoredProcess!
public class GetNextSequence : IIdentifierGenerator, IConfigurable
    {
        private string _item;

        public object Generate(NHibernate.Engine.ISessionImplementor session, object obj)
        {
            using (var nSession = SessionFactoryWrapper.SessionFactory.OpenSession())
            {
                using( var tran = nSession.BeginTransaction(System.Data.IsolationLevel.Serializable))
                {
                    var update = nSession.CreateSQLQuery("update counter set last_one = last_one + 1 where item like :item");
                    update.SetParameter("item", _item);

                    update.ExecuteUpdate();

                    var query = nSession.CreateSQLQuery("SELECT last_one FROM counter WHERE item LIKE :item");
                    query.SetParameter("item", _item);
                    var lastOne = query.UniqueResult();

                    tran.Commit();
                    return lastOne;
                }
            }
        }

        public void Configure(NHibernate.Type.IType type, IDictionary<string, string> parms, NHibernate.Dialect.Dialect dialect)
        {
            parms.TryGetValue("item", out _item);
        }
    }