2010-04-09 6 views
4

내가하고있는 프로젝트에는 응용 프로그램 동작을 변경하는 데 사용되는 많은 정보가 포함 된 레거시 데이터베이스가 있습니다. 기본적으로 나는 무언가에 붙어있어 슈퍼에 대해 신중하게 변경해야합니다.NHibernate, 레거시 데이터베이스, 외래 키가 아닌

내 문제가 있습니다. 이 데이터베이스에는 테이블이 있고이 테이블에는 열이 있습니다. 이 열은 정수를 포함하며 대부분의 기존 데이터는이 열의 값이 0입니다.

이 열은 사실 다른 엔티티에 대한 외래 키 참조이며, 데이터베이스 스키마에서는이 열을 정의하지 않은 것입니다.

이제 새 코드에서 Fluent-NHibernate 매핑을이 열을 참조로 취급하여 엔티티 ID를 직접 코드에서 처리 할 필요가 없도록 정의했습니다. 이 열에 값이 0 인 엔티티가 나타날 때까지 제대로 작동합니다.

NHibernate는 값 0은 유효한 참조라고 생각합니다. 내 코드가 참조 된 객체를 사용하려고하면 ObjectNotFoundException이 발생합니다. ID가 0 인 데이터베이스에는 객체가 없습니다.

매핑이나 일종의 컨벤션을 통해 어떻게 할 수 있습니까? -nhibernate), NHibernate가 NULL 인 것처럼 0 인 id를 처리하도록합니까?

답변

1

나는 예외를 던지기보다는 발견되지 않은 참조 (NotFound.Ignore())를 무시하도록 NHibernate에 알려주는 API를 발견했다. 나는 내가 사용하고있는 것보다 오래된 버전의 유창한 nhibernate 인 온라인에서 발견 된 SetAttribute()에 대한 모든 언급에 혼란 스러웠다.

0

나는 같은 상황에 처해있다. not-found = ignore 문제는 이미 원래 쿼리에서 실행 되었더라도 액세스하려고 할 때마다 관계를 다시 쿼리한다는 것입니다. 기본적으로 최대 절전 모드에서는 관계의 상대방에 대한 레코드가 없다는 사실을 저장하지 않습니다. 디버그 로그에서이를 볼 수 있습니다. 다음은 현재 프로젝트의 예제입니다.

loading entity: 
attempting to resolve: 
object not resolved in any cache: 
Fetching entity: 
loading entity: 
Opened new IDbCommand, open IDbCommands: 1 
Building an IDbCommand object for the SqlString: SELECT townshipdo0_.TOWNSHIP_CODE as TOWNSHIP1_203_0_, townshipdo0_.TOWNSHIP_NAME as TOWNSHIP2_203_0_, townshipdo0_.TOWNSHIP_TYPE_CODE as TOWNSHIP3_203_0_, townshipdo0_.TOWN_ACTIVE_FLAG as TOWN4_203_0_, townshipdo0_.VERS as VERS203_0_ FROM VTTOW_TOWN_CODE townshipdo0_ WHERE townshipdo0_.TOWNSHIP_CODE=? 
binding ' ' to parameter: 0 
SELECT townshipdo0_.TOWNSHIP_CODE as TOWNSHIP1_203_0_, townshipdo0_.TOWNSHIP_NAME as TOWNSHIP2_203_0_, townshipdo0_.TOWNSHIP_TYPE_CODE as TOWNSHIP3_203_0_, townshipdo0_.TOWN_ACTIVE_FLAG as TOWN4_203_0_, townshipdo0_.VERS as VERS203_0_ FROM VTTOW_TOWN_CODE townshipdo0_ WHERE townshipdo0_.TOWNSHIP_CODE=:p0 

'이 바인딩을 시도하는 것을 볼 수 있습니다.이 응용 프로그램의 DB는 null을 나타 내기 위해 빈 공간을 사용합니다 (내가 아는 바보). 그러나 nhibernate가이를 만날 때마다 캐시에서 레코드를 찾을 수없고 실제로 NULL임을 알지 못하기 때문에 DB에서 데이터베이스를 찾으려고합니다.

구성에서 무시할 기본 null 값을 지정할 수 있으면 좋을 것입니다. 현재이 문제를 해결할 수있는 유일한 방법은 쿼리를 사용하여 nhibernate 생성 쿼리에 의존하는 대신 관계를로드하는 것입니다.

관련 문제