NHibernate извлечь DBTransaction из сессии - PullRequest
1 голос
/ 01 декабря 2009

У меня есть устаревшая база данных, где некоторые сохраненные процедуры вычисляют идентификаторы строк для всех таблиц. Теперь я хочу перезаписать IIdentifierGenerator, как указано на этой странице http://www.richter -web.info / Wordpress /? P = 132 просто чтобы избежать Id (x => x.id) .GenereatedBy.Assigned.

Теперь, когда я сохраняю некоторый объект, конечно, внутри транзакции Nhibernate, называемый AnnexHierarchy, затем, как только он попадает в ATKIdGenerator.Generate и запускает command.ExecuteNonQuery (), я получаю некоторые исключения ExecuteNonQuery требует, чтобы у команды была транзакция, когда назначенное команде соединение находится в ожидающей локальной транзакции. Свойство Transaction команды не было инициализировано.

Как извлечь транзакцию БД из объекта сеанса Nhibernate, чтобы присоединить ее к команде?

Я использовал FluentMapping для poco

 public AppendixHierarchyMap()
        {
            Table("appendixHierarchy");
            Id(x => x.id).GeneratedBy.Custom(typeof(ATKIdGenerator), a => a.AddParam("TableName", "appendixHierarchy"));
.....

А вот и Id Generator

public class ATKIdGenerator : IIdentifierGenerator, IConfigurable
    {

        private string TableName { get; set; }
        #region IIdentifierGenerator Members

        public object Generate(NHibernate.Engine.ISessionImplementor session, object obj)
        {
            IDbCommand command = new SqlCommand();
            command.Connection = session.Connection;
            //transaction.Enlist(command);
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "dbo.ups_GetNewId";
            // Set input parameters   
            var parm = new SqlParameter("@tableName", SqlDbType.VarChar);
            parm.Value = TableName;
            command.Parameters.Add(parm);
            // Set output parameter   
            var outputParameter = new SqlParameter("@id", SqlDbType.Int);
            outputParameter.Direction = ParameterDirection.Output;
            command.Parameters.Add(outputParameter);
            // Set a return value   
            var returnParameter = new SqlParameter("@RETURN_VALUE", SqlDbType.Int);
            returnParameter.Direction = ParameterDirection.ReturnValue;
            command.Parameters.Add(returnParameter);
            // Execute the stored procedure   
            command.ExecuteNonQuery();
            return (int)((SqlParameter)command.Parameters["@id"]).Value;    
        }

        #endregion

        #region IConfigurable Members

        public void Configure(NHibernate.Type.IType type, IDictionary<string, string> parms, NHibernate.Dialect.Dialect d)
        {
            TableName = parms["TableName"];
        }

        #endregion
    }

1 Ответ

1 голос
/ 01 декабря 2009

Я думаю, вам нужно открыть другое соединение в методе генерации, а не повторно использовать его в сеансе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...