2012-07-23 5 views
0

현재 NHibernate에서 객체를 우리의 레거시 데이터베이스 스키마에 매핑하려고합니다. 3 개의 테이블이 있습니다.(Fluent) NHibernate : 별도의 테이블에서 객체로 매핑하는 필드

  • 표 A는 I가
  • 테이블 B를 검색 할 필요가있는 실제 객체의 대부분의 정보를 포함하는 테이블 C를 표 A를 연결하는 테이블이다
  • 표 C는 I 개체에 필요한 하나 개의 추가 필드가
  • 정보를 검색 할 수

SQL 쿼리는 다음과 같습니다

SELECT z.ID, z.ZANR, e.TDTEXT 
FROM PUB.table_a z 
JOIN PUB.table_b t ON (t.TDKEY = 602) 
JOIN PUB.table_c e ON (e.ID = t.ID AND e.TDNR = z.ZANR) 
WHERE z.ZANR = 1; 

주요 문제 매핑에서이 두 조인 조건을 지정하는 방법.

엔티티 테이블의는 다음과 같습니다

public class EntityA 
{ 
    public virtual long Id { get; set; } 
    public virtual int Number { get; set; } 
    public virtual string Name { get; set; } 
} 

이름은 열 table_c.TDTEXT에 매핑해야합니다. 나는에서 직접 참조가 없기 때문에, 그러나이 작동하지 않습니다 내가 먼저 How to join table in fluent nhibernate에서와 동일한 전략에 가입 매핑을 시도

public class EntityAMap : ClassMap<EntityA> 
{ 
    public EntityAMap() 
    { 
     Table("PUB.table_a"); 
     Id(x => x.Id).Column("ID"); 
     Map(x => x.Number).Column("ZANR"); 
    } 
} 

:

지금까지이 매핑은 이것이다 table_a를 table_b에 연결하는 유일한 방법은 상수 602 (위의 SQL-query 참조)입니다.

매핑에서 그 상수를 어떻게 든 지정하는 방법을 찾지 못했습니다.

+0

에 위임 이름 속성을 상상할 수 있을까? 지금까지 어떤 매핑을 시도 했습니까? –

답변

0

당신은 읽기 전용 속성을 쉽게

public EntityAMap() 
{ 
    Table("PUB.table_a"); 

    Id(x => x.Id).Column("ID"); 

    // if ZANR always has to be 1 
    Where("ZANR = 1"); 

    Map(x => x.Number).Column("ZANR"); 
    Map(x => x.Name).Formula("(SELECT c.TDTEXT FROM PUB.table_b b JOIN PUB.table_c c ON (c.ID = b.ID AND b.TDKEY = 602 AND c.TDNR = ZANR))"); 
} 

업데이트로 이름을 매핑 할 수 있습니다 : 만 숨겨진 참조 거기에 당신의 실체는 무엇처럼 보이나요

public EntityAMap() 
{ 
    HasOne(Reveal.Member<EntityA>("hiddenEntityC")); 
} 

public class EntityB 
{ 
    public virtual int Id { get; set; } 
    public virtual EntityA EntityA { get; set; } 
} 

public EntityCMap() 
{ 
    Where("Id = (SELECT b.Id FROM PUB.table_b b WHERE b.TDKEY = 602)"); 

    References(x => x.EntityA).PropertyRef(x => x.Number); 
} 
+0

문제는 기본 데이터베이스 엔진이 WHERE 문에서만 SELECT 절의 하위 쿼리를 지원하지 않는다는 것입니다. 또한이 값을 수정할 수 있어야합니다. – cguedel

+0

고맙습니다. 그러나 다른 TDKEY로 엔티티 C를 참조 할 다양한 엔티티가 필요하기 때문에 그다지 실용적이지 않습니다. 아마도 엔티티 B/C를 참조하지 않고 엔티티 B/C를 매핑하고 접착제 클래스를 사용하는 것일 수 있습니다. 문제가 해결 되었기 때문에 대답을 수락합니다. – cguedel

+0

다른 Where 절로 원하는만큼 자주 EntityC를 참조 할 수 있습니다. 각각에 대해 다른 엔티티 이름을 정의하고 하나의 엔티티에 지정해야합니다. – Firo

관련 문제