2010-07-26 5 views
1

다른 애플리케이션에서 사용하는 이전 데이터베이스와 함께 작업 중이므로 구조를 수정할 수 없습니다. 가끔 null 허용되지 않는 유형으로 매핑하려는 null 허용 열이 있습니다. 예를 들어 nullable DateTime에 매핑 할 데이터베이스에 nullable EndValidity 열이 있습니다. null 일 경우 DateTime.MaxValue이거나보다 간단한 예제로 false 여야하는 nullable bit 열 if 없는.NHibernate : 널 (null) 컬럼에 대한 프로퍼티의 디폴트 값

가능한 경우 매개 변수를 사용하여 사용자 지정 사용자 유형을 작성하려고합니다. 아니면 거기에 nHibernate에 포함 된 내용입니까?

유일한 해결책은 사용자 정의 사용자 유형을 작성하는 것입니다. 부울의 경우에는 항상 fluentnhibernate 규칙을 재정의하여 해당 사용자 유형을 항상 부울에 적용 할 수 있습니까?

답변

1

아마도 poco 클래스를 어떻게 원하는지에 달려 있습니다. 먼저 null 값을로드하는 경우 Null 값을 다시 저장 하시겠습니까? 아니면 세션 커밋/플러시를 통해 Null 필드의 새 기본값으로 레코드를 업데이트 하시겠습니까? DB에 null 값을 유지하려면 IE boolean 값을 저장하는 부울 값으로 poco 개체에서 어떻게 감지하겠습니까? true/false 옵션/값만 있지만 비트 클래스는 null/0과 1?

만약 당신이 당신의 nullable 비트를 부울로하고 당신의 poco 클래스에 null 값을 허용하지 않는 부울 dataype를 갖고 싶다면 클래스가 널을 모두 제거하기 위해 db를 업데이트하게하고 커스텀으로 빠져 나가지 않으면서도 빠르다. 유형은 하나의 nullable, protected 또는 internal 및 하나의 속성을 기본 논리로 인터페이스에 매핑합니다 (의존성을 이유로 모든 poco 클래스가 이상적으로 인터페이스 또는 2를 가짐). EG

internal virtual bool? isActive {get;set;} 
public bool MyInterface.IsActive 
{ 
    get{ return isActive ?? false; } 
    set{ isActive == value ?? false; }; 
} 

논리가 코드에 포함 된 방식으로 규칙이 복잡해 지거나 복잡한 경우 또는 null 허용 비트가 기본값 인 경우 false이지만 기본값은 false입니다. (지난 세기의 일부 미친 개발자 덕분에) 변형을보다 쉽게 ​​제어 할 수 있습니다. 실제 poco 클래스 대신 인터페이스로 작업해야하지만, 나쁜 것은 아닙니다. 개발 모델에 따라 다릅니다.

+0

이 필드를 필터링하고 싶다면 nHibernate에 'where obj.IsActive == false'와 같은 것을 입력하십시오. 필터링은'internal isActive' 속성의 매핑을 통해 데이터베이스에 전달 될 것인가, 필터링은 .net의 필터링되지 않은 결과에 대해 수행 될 것입니까? – Alex

+0

Linq를 사용 중이라고 가정하고 DB 레벨이 아닌 메모리에 있다고 가정합니다. 만약 당신이 Linq/IQueryOver/ICriteria/HQL에 NHibernate를 사용하고 있다면 IsActive가 매핑되지 않았고 NHibernate가 어떻게 작동하는지 모를 때 런타임 에러가 발생할 것이라고 생각합니다. – cdmdotnet