2010-12-10 4 views
0

면책 조항 : 나는 일반적으로 NH & ORM을 아주 좋아한다.Optional SubclassMap (left join) with NHibernate 3.0 GA & FNH

면책 조항 : NH3.0GA와 함께 사용하려면 here에서 FNH 빌드로 작업하고 있습니다.

public class MyBaseClass { 
    public virtual int Id { get; set; }  
} 

public class MySubClass : MyBaseClass { 
    public virtual string SubClassVal { get; set; } 
} 

이 :

요컨대 문제는 내가 테이블 당 서브 시나리오로 정의 내 객체 계층 구조에 조인 LEFT를 매핑하는 방법으로 FNH의 SubclassMap를 사용하고자하는 것입니다 로 FNH를 통해 매핑됩니다 :

public class MyBaseClassMap : ClassMap<MyBaseClass> { 
    public MyBaseClassMap() { 
     Table("BaseClass"); 
     Id(x => x.Id, "Id").GeneratedBy.Assigned(); 
    }   
} 

public class MySubClassMap : SubclassMap<MySubClass> { 
    public MySubClassMap() { 
     Table("SubClass"); 
     KeyColumn("Id"); 
     Map(x => x.SubClassVal); 
    } 
} 

그리고 난을 통해 검색 :

public class Repository { 
    ISession session; //assume properly initialized ISession 
    public IList<T> GetAll<T>() where T: class { 
     return session.CreateCriteria<T>().List<T>(); 
    } 
} 

그리고 내 데이터베이스에서 BaseClass 테이블에 1 레코드가 있고 0 레코드는 SubClass입니다.

이제

은, 내가 뭘하고 싶은 이런 일을 수행하여 MySubClass 인스턴스로 엔티티를 꺼내입니다 :

var rep = new Repository(); 
var subclasses = rep.GetAll<MySubClass>(); 

그리고 이것은 아마도 같이 물론, 반환 된 컬렉션에는 인스턴스가 없습니다 그것 아래의 내부 결합을 수행합니다. 내가 붙어있는 곳이야. 나는 '선택적인'조인을 지정하는 것이 내가 이라고 가정하고을 수행한다는 것을 발견했습니다.

public class MySubClassMap : SubclassMap<MySubClass> { 
    public MySubClassMap() { 
     Join("SubClass", j => { 
      j.KeyColumn("Id"); 
      j.Optional(); 
      j.Map(x => x.SubClassVal); // note that I've tried the map outside the Join() below, to no avail 
     }); 
     //Map(x => x.SubClassVal); 
    } 
} 

컴파일 /이를 실행하면 다음과 같은 (안쪽)을 제외하고 저를 제시한다 :

요소 '에 합류-서브 클래스'네임 스페이스 '항아리 : NHibernate에-mapping- 난에 MySubClassMap을 수정하려고 시도했습니다 2.2 '는 네임 스페이스'urn : nhibernate-mapping-2.2 '에서 유효하지 않은 하위 요소'join '을가집니다. 예상 가능한 요소 목록 : '속성, 다 대일, 일대일, 구성 요소, 동적 구성 요소, 속성, 임의,지도, 집합, 목록, 자루, idbag, 배열, 프리미티브 배열, 조인 된 하위 클래스 , loader, sql-insert, sql-update, sql-delete, resultset, query, sql-query '네임 스페이스'urn : nhibernate-mapping-2.2 '에 있습니다.

내가 스택 추적을 게시 절약 할 수 있지만, 그것의 JIST은 다음과 같습니다

MyApp --> 
FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() --> 
NHibernate.Cfg.FluentConfiguration.BuildConfiguration() 

나는 모든 관련 정보의 그 생각 . 나는이 새 버전의 NH와 FNH 버전 사이의 새로운 변화가 아니라는 생각이 든다. 그러나, 앞서 언급했듯이, 나는 신참이며 어리석은 일을 잘 할 수 있습니다. 이 경우, 누군가가 분명히해야 할 일로 머리를 두드리는 것을 매우 고맙게 생각합니다.

미리 감사드립니다.

답변

2

엔티티에는 하나의 유형이 있으며 변경되지 않습니다. BaseClass 테이블에만 레코드가 있다면 해당 엔티티는 항상 MyBaseClass입니다.

엔티티가 "유형"을 변경할 수 있으면 상속을 사용해서는 안되며 구성해야합니다.

+0

나는 어색하다고 생각했습니다. 나를 분류 해줘서 고마워. – Devfellow