2010-05-27 5 views
12

ID가없는 뷰를 매핑하려고하지만 nhibernate는 여전히 ID 열이있는 sql을 생성합니다. ID 열은 db에 없으므로 SQL 오류가 발생합니다. . 아마 Id() 생성자를 오해하고 있습니까?유창한 NHibernate 가져 오기 뷰 고유 식별자없이

생성자 코멘트 :

가 도메인 개체, 또는 데이터베이스의 열에 해당하는 속성이 없습니다 ID를 만듭니다. 이것은 주로 읽기 전용 액세스 및/또는보기에서만 사용됩니다. 디폴트는 "증가"생성자가있는 int 신원입니다.

public class PersonMapping : ClassMap<Person> 
{ 
    public PersonMapping() 
    { 
     Table("person"); 
     ReadOnly(); 

     Id(); 
     Map(f => f.Name, "name"); 
    } 
} 

답변

8

NHibernate는 ID가 필요합니다. doc 메서드는 도메인 개체에 해당 속성이없는 ID를 만듭니다. 그러나 데이터베이스에는 여전히 ID가 있습니다.

테이블에 식별자로 표시 할 필드가없는 경우 (고유해야 함) 어쩌면 합성 ID로 구성 될 수있는 일부 열을 식별하려고 할 수 있습니다. 예를 들어 당신이 한 모든 A/B 조합이 고유로 복합 ID를 사용할 수

A | B 
----- 
1 | 2 
1 | 3 
2 | 2 

같은 다른 INT 일부 INT를 연결하는 단순 링크 테이블을 감안할 때

.

public PersonMapping() 
{ 
    [...] 
    CompositeId() 
     .KeyProperty(x => x.A) 
     .KeyProperty(x => x.B); 
    [...] 
} 
+0

절대적으로 DB 필드를 무시할 수있는 방법이 있습니까? Id (Guid.NewGuid) 또는 smth처럼? –

5

엔티티가 아닌 값 개체 (관리되지 않는 엔티티)로 레코드를 검색 할 수 있습니다.

"14.1.5. 반환 비 관리 대상 항목

네이티브 SQL 쿼리에 IResultTransformer을 적용하는 것이 가능하다. 예를 들어, 반환이 아닌 관리 대상 항목에 허용.

sess.CreateSQLQuery("SELECT NAME, BIRTHDATE FROM CATS") 
    .SetResultTransformer(Transformers.AliasToBean(typeof(CatDTO))) 

이를 지정된 조회 :

  • SQL 쿼리 문자열
  • 결과 트랜스포머

상기 쿼리의 인스턴스와 해당 속성 또는 필드에 NAMEBIRTHNAME 값을 주입 한 CatDTO의리스트를 반환한다. "