NHibernate从Session中提取DBTransaction

时间:2009-12-01 16:25:02

标签: nhibernate transactions fluent

我有一个遗留数据库,其中一些存储过程计算所有表的行ID。 现在我想覆盖IIdentifierGenerator,如此页面所示http://www.richter-web.info/Wordpress/?p=132 只是为了避免Id(x => x.id).GenereatedBy.Assigned。

现在我保存了一些对象,当然在Nhibernate事务中,名为AppendixHierarchy,然后一进入ATKIdGenerator.Generate并启动command.ExecuteNonQuery()我收到一些异常 当分配给命令的连接处于挂起的本地事务中时,ExecuteNonQuery要求命令具有事务。该命令的Transaction属性尚未初始化。

如何从Nhibernate会话对象中提取数据库事务,以便将其附加到命令?

我使用了Fluent的FluentMapping

 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 个答案:

答案 0 :(得分:1)

我认为您需要在generate方法中打开另一个连接,而不是在会话中重新使用一个连接。