2009-12-01 3 views
1

나는 저장된 proc이 모든 테이블에 대한 행 ID를 계산하는 레거시 db를 가지고있다. 이제 Idd (x => x.id) .GenereatedBy.Assigned를 피하기 위해이 페이지에서 암시 된대로 IIdentifierGenerator를 http://www.richter-web.info/Wordpress/?p=132 덮어 쓰려고합니다. 이 ATKIdGenerator.Generate에 도착하고 command.ExecuteNonQuery을() 나는 몇 가지 예외를받을 ExecuteNonQuery는이이 명령을 요구 시작으로 그때 빨리, AppendixHierarchy라는 NHibernate에 거래, 내부 물론, 일부 개체를 다른 이름으로 저장 이제NHibernate는 세션에서 DBTransaction을 추출한다.

명령에 지정된 연결이 보류중인 로컬 트랜잭션에있을 때 트랜잭션. 명령의 Transaction 속성이 초기화되지 않았습니다.

Nhibernate 세션 객체에서 DB Transaction을 추출하여 명령에 첨부하려면 어떻게해야합니까?

은 내가 마시고

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

을위한 FluentMapping을 사용 그리고 여기 당신이 하나를 다시 사용보다는 방법 생성의 또 다른 연결을 열 필요가 있다고 생각 이드의 발전기

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

기본적으로 작동합니다. 그러나 그것은 어떻게 든 느립니다. 엔티티 저장을 호출하기 전에 Generate를 호출하고 엔티티의 실제 삽입을 적용하기 전에 60 초가 걸립니다 ... 이것은 너무 느립니다 ... – urpcor