0

우리는 다음과 같은 데이터베이스 구조를 가지고 :유창함 NHibernate에 매핑 조회 테이블에서 설명을 반환

UserTeam table 
Id (PK, int not null) 
UserId (FK, int, not null) 
TeamId (FK, int, not null) 
RoleId (FK, int, not null) 

libRole table 
Id (PK, int not null) 
Description (varchar(255), not null) 

을 다음과 같이 우리는 엔티티를 가지고 :

public class UserTeam 
{ 
    public int Id { get; set; } 
    public Team Team { get; set; } 
    public User User { get; set; } 
    public int RoleId { get; set; } 
    public string Role { get; set; } 
} 

을 우리는 유창함 자 NHibernate를 사용하여 자동으로 NHibernate에를 구성하는 (즉, 오버라이드가있는 오토 메이션 클래스 사용).

우리는 libRole 테이블의 설명 열을 UserTeam 테이블의 "Role"속성으로 가져 오려고하지만 실제로 어려움을 겪고 있습니다. 다음은 우리가 가지고 가장 가까운 :

SELECT 
    TOP (@p0) this_.Id as Id70_0_, 
    this_.RoleId as RoleId70_0_, 
    this_.TeamId as TeamId70_0_, 
    this_.UserId as UserId70_0_, 
    this_1_.Description as Descript2_71_0_ 
FROM 
    [UserTeam] this_ 
inner join 
    libRole this_1_ 
     on this_.Id=this_1_.Id; 

닫기하지만, NHibernate에 조인에 UserTeam 테이블과 libRole 테이블 모두에서 ID 열을 사용하는 다음 SQL을 생성

public class UserTeamMap : IAutoMappingOverride<UserTeam> 
{ 
    public void Override(FluentNHibernate.Automapping.AutoMapping<UserTeam> mapping) 
    { 
     mapping.References(m => m.User).Column("UserId"); 
     mapping.References(m => m.Team).Column("TeamId"); 

     mapping.Join("Role", join => 
      { 
       join.Fetch.Join(); 
       join.KeyColumn("Id"); 
       join.Map(x => x.Role, "Description"); 
      }); 
    } 

} 

, 언제해야하는지 this_.RoleId=this_1_.Id

우리가 무엇이 빠져 있습니까? 우리가 정말로 신경 쓰는 것은 설명 값입니다. 이것은 사용자가 구성 할 수 있기 때문에 열거 형을 사용할 수 없기 때문에 우리는 실제로 응용 프로그램 내에 "libRole"엔티티를 만들고 싶지 않습니다. 누구든지 도와 줄 수 있습니까?

답변

0

Join은 상위 테이블의 기본 키를 사용합니다. 이것을 외부 키로 변경할 수는 없습니다. Join의 가능한 자세한 내용은 docs을 참조하십시오.

이 상황에서 조회를 위해 엔티티를 만드는 것이 좋습니다. 당신이 정말로, 수식과 속성을 매핑 할 수 있습니다이 방법을 먹고 싶어

Map(x => x.Role).Formula("(select description from libRole where Id = RoleId)"); 

참고 즉 경우 쿼리는 다음 RoleId라는 이름의 열이 다른 테이블이 RoleId 그렇다면 사용하기 때문에 그러나 이것은 완벽하지 않다 DBMS는 SQL을 실행할 때 불평 할 것이다.

+0

감사합니다. penfold. 수식 루트에 대해 생각했지만 언급 한 이유와 SQL 결합만큼 효율적이지는 않을 것입니다 (libRole 테이블에서 수백만 행을 다루지는 않지만 여전히 그렇습니다).). NHibernate가 둘 이상의 테이블에서 엔티티에 대한 데이터를 읽도록하는 방법이 없다는 것은 이상한 것 같습니다. – MajorRefactoring

+0

외래 키로 가입 할 수없는 것 같습니다. 오픈 한 이슈가 있습니다. [NH-1452] (https://nhibernate.jira.com/browse/NH-1452) 및 [NH-3143] (https://nhibernate.jira.com/browse/NH-3143)을 참조하십시오. 이 기능을 추가하기위한 일부 [작업 완료] (https://github.com/Nicaog/nhibernate-core/tree/NH-1681)가 있지만 트렁크와 병합되지 않았습니다. – mickfold

+0

정말 그 주위에 방법이 없을 것 같네요. 결국 우리는 실제로 어디서나 사용되지 않았으므로 객체에서 Role 속성을 제거했습니다. 이는 10 년 전에 찍은 디자인 결정에서 숙취였습니다 ... 그래서 이것을 대답으로 표시했습니다. nhibernate가 어떤 시점에서 그것을 수용한다는 것을 알기에 좋은데 - 우리가 실제로 그것을 원한다면 우리는 포크를 잡고 스스로 고쳐야 할 수도 있습니다. :) – MajorRefactoring