0

저는 기존의 기능적 응용 프로그램에있는 많은 NHibernate 매핑을 상속 받았습니다. 몇 가지 새로운 기능을 개발하기 위해이 응용 프로그램을 분기했습니다. 그러는 동안 TDD와 비슷한 접근 방식을 허용하도록 테스트 인프라를 확장했습니다. 하지만 이제는 통합 테스트 중 하나에서 벽에 부딪 혔습니다 ...레거시 매핑에서 NHibernate 매핑 오류가 발생했습니다.

통합 테스트를하기 전에 테스트 데이터가있는 클래스가 있습니다. 이들을 삽입하는 메소드에서 다음 예외가 발생합니다.

NHibernate.PropertyAccessException : 유효하지 않은 캐스트 (등록 정보 유형 불일치에 대한 맵핑 점검); Setter of Domain.Entities.Project ---> System.InvalidCastException : 형식 'System.Object'형식의 개체를 'Domain.Entities.ProjectModules'형식으로 캐스팅 할 수 없습니다.

나는 이유를 알 수 없습니다. 내가 설정에 대한 데이터베이스에 유지하려고 두 Project 경우, 모두 다음과 같이 정의되어 있습니다

유창함 NHibernate에 매핑 (의 관련 부분)은 다음과 같습니다
new Project("2023", "projeName", "projaddr") 
{ 
    PrincipalOwner = UserOne, // UserOne and Office are other properties 
    Office = Office, 
    // I've tried just not instantiating this too - gave the same exception 
    ProjectModules = new ProjectModules 
    { 
     HasModuleOne = false, 
     HasModuleTwo = false 
    }); 
}); 

:

Component(m => m.ProjectModules, c => 
{ 
    c.LazyLoad(); 
    c.Map(x => x.HasModuleOne) 
     .Column("ModuleOne").Not.Nullable().Default("0"); 
    c.Map(x => x.HasModuleTwo) 
     .Column("ModuleTwo").Not.Nullable().Default("0"); 
}); 
+0

호기심이 많았지 만 추가 한 새로운 매핑입니까, 아니면 Fluent NH의 새 버전에서 작동하지 않는 이전 매핑 이었습니까? 아니면 전혀 작동하지 않는 오래된 코드입니까? –

+0

@Cole :이 매핑은 오래되었지만 FNH의 버전이나 버전을 변경하지 않았습니다. 빌드하려고하는 것과 같은 통합 테스트가 실행 된 적이 없다고 생각합니다. 이전 클래스를 사용하여 새 테스트 데이터를 만들었습니다. 그러나 이러한 매핑은 FNH의 동일한 버전과 함께 사용자가 불평하지 않는 프로덕션 환경에서 사용됩니다. P –

+0

Nice! 그런 말로 사용자들은 생산에 새로운 프로젝트를 만든다는 말이 맞습니까? 그렇다면 개체를 만드는 방법에 차이가 있습니까? 제작 과정에서 이러한 객체를 만들지 않는 한 통합 테스트가 다른 이유는 없습니다. 그 차이가 다른 경우 아마 당신을 답으로 인도하는 데 도움이 될 것입니다. –

답변

1

I 어떤 이유로, NHibernate는 컴포넌트 매핑이 Project를위한 매핑에서 인라인으로 지정되었을 때 맘에 들지 않았습니다.하지만 매핑을 별개의 클래스 ComponentMap<T>으로 옮기면 NHibernate가 작동했습니다. 그래서

Component(p => p.ProjectModules); 

에 문제가있는 라인을 변경하고 내 매핑 어셈블리에 다음 클래스를 추가 : 내가 처음부터 그것을 예상 한 것처럼

public class ProjectModulesMap : ComponentMap<ProjectModules> 
{ 
    LazyLoad.Always(); 
    Map(pm => pm.ModuleOne); 
    Map(pm => pm.ModuleTwo); 
} 

그런 다음 모든했다.

관련 문제