2010-08-12 3 views
0

실제 데이터베이스로 이동하거나 데이터베이스 게시판을 지키지 않고 C# Sqlite로 단위 테스트를 실행하려고 시도했습니다. Nhibernate C# Sqlite .C#을 가진 NHibernate -> .NET 2.0에 DbConnection이 없음

불행히도 NHibernate는 C# -Sqlite 드라이버가 제공하지 않는 DbConnection이되도록 연결해야합니다. 나는 소스 코드에보고하고 다음 코드를 발견 :

#if NET_2_0 
public class SqliteConnection : DbConnection, ICloneable 
#else 
    public class SqliteConnection : IDbConnection, ICloneable 
#endif 

이 Aparently 저자는 "오래된"기본 클래스를 중단하고 IDbConnection을, IDbTransaction, ... 대신 인터페이스를 사용하기로 결정했다.

코드를 변경하는 것은 테스트 및 유지 관리해야하는 새 클라이언트를 작성하는 것과 같기 때문에 옵션을 사용할 수 없습니다.

누구나 NHibernate와 C# sqlite 작업의 현재 버전을 얻는 쉬운 해결책을 알고 있습니까?

+0

왜이 문제가 (데이터베이스에 우리의 스키마를 수출하는) 세션 공장을 다시 내 공장 클래스에서 사용하는 이벤트를 추가? –

+0

문제가 실제로 무엇인지 잘 모르겠습니다. 내가 sqlite로 테스트하는 방법을 말할 수있다. –

+0

예외 : 15 : 03 : 28,877 ERROR [7] SchemaValidator [(null)] - 데이터베이스 메타 데이터를 가져올 수 없습니다. System.InvalidCastException : Das Objekt des Typs "Community.CsharpSqlite.SQLiteClient.SqliteConnection" System.Data.Common.DbConnection "umgewandelt werden. bei NHibernate.Tool.hbm2ddl.ManagedProviderConnectionHelper.Prepare() bei NHibernate.Tool.hbm2ddl.SchemaValidator.Validate() – Zebi

답변

0

내가 사용하여 문제를 해결 노출 것을 볼 수 있습니다 System.Data.SQLite 및 사용자 지정 연결 공급자 :

public class SqLiteInMemoryConnectionProvider : DriverConnectionProvider 
{ 
    public static IDbConnection Connection; 

    public static event EventHandler ConnectionReset; 

    public static void ResetConnection() 
    { 
     if(Connection == null) return; 

     Connection.Close(); 
     Connection.Open(); 

     if(ConnectionReset != null) ConnectionReset(null, new EventArgs()); 
    } 

    public override IDbConnection GetConnection() 
    { 
     if (Connection == null) 
     { 
      Connection = base.GetConnection(); 
     } 
     if (Connection.State != ConnectionState.Open) 
     { 
      Connection.Open(); 
     } 
     return Connection; 
    } 

    public override void CloseConnection(IDbConnection conn) { } 
} 

stefan Steineggers와의 차이 soluti 내가 NHibernate가 방금 처리하면 새 연결을 얻을 수 없기 때문에 다시 닫고 다시 세션을 다시 열 수 있습니까? 는 또한 나는

SqLiteInMemoryConnectionProvider.ConnectionReset += (s, _) => RebuildSessionFactory(); 
1

sqlite를 사용하여 테스트하고 있습니다. 나는 다른 접근법을 가지고있다.

NH는 연결을 만들지 만 정적 변수에 저장하여 후속 세션에 전달합니다.

static IDbConnection staticSqliteConnection; 

if (staticSqlliteConnection == null) 
{ 
    sessionFactory.CreateSession().Connection; 
} 
다음

나는 몇 가지 문제를 가지고 내 생산 코드에 너무 많은 테스트 특정 코드를 가지고 있었다 (나는 아무도 없어 선호) : 제가 테스트 프레임 워크를 쓰기 시작

,이 같은 초기화 코드를했다 . Hi-Lo id 생성기는 세션에 연결을 전달하면 작동하지 않습니다.

가 그럼 난 이렇게 찾고 ConnectionProvider를 클래스 썼다 : 단위 테스트 정리 방법

public class SingleConnectionProvider : DriverConnectionProvider 
{ 
    private static IDbConnection staticConnection = null; 

    public static void ResetConnection() 
    { 
     if (staticConnection == null) return; 
     staticConnection.Dispose(); 
     staticConnection = null; 
    } 

    public override IDbConnection GetConnection() 
    { 
     if (staticConnection == null) 
     { 
      staticConnection = base.GetConnection(); 
     } 
     if (staticConnection.State != ConnectionState.Open) 
     { 
      staticConnection.Open(); 
     } 
     return staticConnection; 
    } 

    protected override void Dispose(bool isDisposing) 
    { 
     ResetConnection(); 
    } 
} 

를, 당신은 다음 테스트에 대한 데이터베이스를 파괴 SingleConnectionProvider.ResetConnection()를 호출합니다.

모든 것이 물론 스레드로부터 안전하지 않습니다. 원하는만큼 세션을 만들 수 있지만 동시에 생성하지 않아야합니다.

+0

해결책 주셔서 감사합니다. 문제를 해결하기 위해 연결 제공자를 직접 구현하려고합니다. 현재 Sqlite 작동 방식을 테스트하기위한 새로운 세션 팩토리를 만드는 테스트 만 있습니다. "Fluently.Configure() .... BuildSessionFactory()" 위의 오류 메시지가 throw됩니다. 장기적으로 나는 모든 조롱 된 세션 팩토리를 sqlite 데이터베이스를 기반으로 한 실제 팩토리로 대체하려고합니다. – Zebi

0

당신은 당신의 코드 예제를 보면,

#if NET_2_0 
public class SqliteConnection : DbConnection, ICloneable 
#else 
    public class SqliteConnection : IDbConnection, ICloneable 
#endif 

당신은 컴파일러 옵션 NET_2_0 및 재 컴파일을 정의함으로써, 기존의 인터페이스

+0

아 - NET_2_0이 "디버그"와 같은 "빌드"옵션이고 작업 대상이되지 않는 .net 2.0 프로젝트를 빌드하려고 시도했다고 생각했습니다. 나는 이것을 월요일에 시험 할 것이다. SQLite 포팅 작업을 해주셔서 감사합니다! – Zebi

+0

NET_2_0으로 컴파일 할 수 없습니다 : ( DbConnectionFactory는 요즘 "내부"로 플래그 됨 - 코드가 컴파일되지 않습니다. 대상 프레임 워크를 2.0으로 변경하더라도 Stefan Steineggers가 곧 내게 도움이 될 것입니다. . – Zebi

관련 문제