5

정확한 질문을하고 있는지 확실하지 않으므로 나와 함께하시기 바랍니다! NHibernate 놈의 비트.Fluent NHibernate - HiLo 체계의 PersistenceSpecification

우리는 모든 테이블

public class IdGenerationConvention : IIdConvention 
{ 
    public void Apply(IIdentityInstance instance) 
    { 
     var where = string.Format("TableKey = '{0}'", instance.EntityType.Name); 
     instance.GeneratedBy.HiLo("HiloPrimaryKeys", "NextHighValue", "1000", x => x.AddParam("where", where)); 
    } 
} 

우리는 HiloPrimaryKeys 테이블 및 배포에 실행됩니다 데이터 씨앗을 생성하는 SQL 스크립트를위한 유창함 NH을 사용하여 다음과 같은 ID 생성 방식을 가지고 있습니다. 이것은 잘 작동합니다.

이제 우리의 영속 계층을 검증하기위한 단위 테스트를 작성하려고합니다. 메모리 구성에서 SQLite를 사용하는 것이 이상적입니다.

[SetUp] 
public void SetupContext() 
{ 
    config = new SQLiteConfiguration() 
      .InMemory() 
      .ShowSql() 
      .Raw("hibernate.generate_statistics", "true"); 

    var nhConfig = Fluently.Configure() 
      .Database(PersistenceConfigurer) 
      .Mappings(mappings => 
       mappings.FluentMappings.AddFromAssemblyOf<DocumentMap>() 
      .Conventions.AddFromAssemblyOf<IdGenerationConvention>()); 

    SessionSource = new SessionSource(nhConfig); 
    Session = SessionSource.CreateSession(); 
    SessionSource.BuildSchema(Session); 
} 

문제는 내가 그것을 테스트하는 동안 올바른 스키마 및 종자 데이터를 생성하도록 우리의 배포 스크립트에 대한 NHibernate에 얘기하는 방법을 모르는 것입니다 : 이것은 내가 테스트를 위해 NH을 구성하는 방법입니다.

TestCase ... failed: 
Execute 
NHibernate.Exceptions.GenericADOException: 
     could not get or update next value[SQL: ] 
     ---> System.Data.SQLite.SQLiteException: SQLite error 
     no such column: TableKey 

그래서 내 공제가 배포 스크립트를 실행하지 않은 것입니다 : 다음과 같은 예외가 발생

[Test] 
public void ShouldAddDocumentToDatabaseWithSimpleValues() 
{ 
    new PersistenceSpecification<Document>(Session) 
      .CheckProperty(x => x.CreatedBy, "anonymous") 
      .CheckProperty(x => x.CreatedOn, new DateTime(1954, 12, 23)) 
      .CheckProperty(x => x.Reference, "anonymous") 
      .CheckProperty(x => x.IsMigrated, true) 
      .CheckReference(x => x.DocumentType, documentType) 
      .VerifyTheMappings(); 
} 

:

내가 할 특정 문제는 다음 PersistenceSpecification 테스트를 실행하는 경우 지속성 스펙을 확인할 때.

이 상황에 대한 기존 솔루션이 있습니까? 내 Google-fu는 나를이 사이트에 버려진 것 같습니다.

답변

4

Brian이 말했듯이 스키마를 만든 후에 배포 스크립트를 실행할 수 있습니다. 이 코드는 나를 위해 잘 작동합니다 :

var config = new SQLiteConfiguration() 
     .InMemory() 
     .ShowSql() 
     .Raw("hibernate.generate_statistics", "true"); 

var nhConfig = Fluently.Configure() 
     .Database(config) 
     .Mappings(mappings => 
      mappings.FluentMappings.AddFromAssemblyOf<DocumentMap>() 
     .Conventions.AddFromAssemblyOf<IdGenerationConvention>()); 

var SessionSource = new SessionSource(nhConfig); 
var Session = SessionSource.CreateSession(); 
SessionSource.BuildSchema(Session); 

// run the deployment script 
var deploymentScriptQuery = Session.CreateSQLQuery("ALTER TABLE HiloPrimaryKeys ADD COLUMN TableKey VARCHAR(255); INSERT INTO HiloPrimaryKeys (TableKey, NextHighValue) values ('Document', 1);"); 
deploymentScriptQuery.ExecuteUpdate(); 

배포 스크립트 파일 등을로드 할 수 ...

건물 FNH 구성 및 데이터베이스 스키마는 시간이 조치를 소요됩니다. 스키마를 사용하는 테스트의 수가 증가하고 스키마 및 구성이 각 테스트 클래스별로 작성되는 경우 테스트 슈트를 실행하는 데 시간이 오래 걸립니다.모든 테스트간에 구성 및 스키마를 공유해야합니다. Here은 테스트 격리를 풀지 않고이를 달성하는 방법입니다.

EDIT : 테스트에 둘 이상의 세션 인스턴스가 필요한 경우 연결 풀링을 설정하거나 두 세션을 동일한 연결을 통해 만들어야합니다. 세부 사항 here ...

0

면책 조항 : 내가 NHibernate에 사용자 아니에요 ...

...하지만 한 가지 가능한 해결 방법은 쉘을 사용 (테스트의 설정 방법에 배포 스크립트 (또는 일부 변형)를 실행하는 것입니다/Process.Start를 실행하십시오.) 또는이 테스트를 실행하기 바로 전에 빌드 스크립트에서 실행하십시오. 이 경우 각 데이터베이스마다 새로운 데이터베이스를 원할 경우 정리를 추가해야 할 수도 있습니다.

+0

그래, 나는 그것을 보았다. 그러나 PersistenceSpecification은 당신이 만들었을지도 모르는 어떤 변경이 아니라 NH에 의해 생성 된 스키마에서 작동하는 것처럼 보인다. –

0

우리는 HiloPrimaryKeys 테이블을 생성하고 배포 도중 실행되는 데이터로 시드하는 SQL 스크립트를 가지고 있습니다. 이것은 잘 작동합니다.

테스트를 시작하기 전에이 HiloPrimaryKeys 테이블을 나타내는 매핑 된 엔티티를 만들고이 테이블을 채울 수 있습니까? 모든 다른 테스트가 상속하는 기본 클래스에 넣을 수 있으므로 모든 테스트 클래스에이 클래스를 추가 할 필요가 없습니다.

이것은 Brian의 솔루션과 비슷하지만 나머지 테이블과 마찬가지로 자동 매핑을 수행 할 때이 테이블이 만들어집니다.