2009-12-01 34 views
1

我有一個遺留數據庫,其中一些存儲過程計算所有表的行ID。 現在我想覆蓋IIdentifierGenerator暗示在此頁http://www.richter-web.info/Wordpress/?p=132 只是爲了避免Id(x => x.id).GenereatedBy.Assigned。NHibernate從會話提取DBTransaction

現在我節省一些對象,當然是NHibernate的交易,命名AppendixHierarchy內,那麼只要它進入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生成

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

這工作基本上。但它以某種方式緩慢。 在我調用Save的任何實體之前,它會調用Generate,然後在應用該實體的實際插入之前需要60秒... 這太慢了...... – urpcor 2009-12-04 11:07:19