2010-01-22 4 views
2

안녕하세요 저는 NHibernate의 초보자입니다. 내 세 테이블에 조인을 사용하여 데이터베이스에 하나의 SQL 쿼리를 만들고 싶습니다.NHibernate CreateSqlQuery와 객체 그래프

많은 사용자와 많은 역할을 가진 응용 프로그램이 있습니다. 나는 NHibernate가 Application 객체로 시작하는 객체 그래프를 적절히 형성하도록하려고 노력 중이다. 예를 들어 10 개의 응용 프로그램 레코드가있는 경우 10 개의 응용 프로그램 개체가 필요하며 해당 개체는 사용자가있는 역할을 갖습니다. 그러나 내가 얻는 것은 전체 사용자 레코드만큼 많은 응용 프로그램 개체가있는 데카르트 제품과 유사합니다.

나는 이것으로 꽤 보면서 제대로 응용 프로그램 계층 구조를 형성 할 수있다 확실하지 않다했습니다. 나는 평평해진 물건 만 돌아올 수 있습니다. 내 연구에서 NHibernate 릴리스에 곧 출시 될 LINQ와 함께 "그룹화 된 조인"및 "계층 적 결과"에 대해 읽은 것처럼 "아마도"가능할 것으로 보입니다. 다시 말하지만 나는 초보자입니다.

당신을 위해

덕분에 시간을 사전에 [내가 뭘 원하는 추측하고있어 여기 Ayende의 게시물에 프랑스어의 의견을 바탕으로 업데이트 http://ayende.com/Blog/archive/2008/12/01/solving-the-select-n1-problem.aspx 수 없습니다].

Session.CreateSQLQuery(@"SELECT a.ID, 
       a.InternalName, 
       r.ID, 
       r.ApplicationID, 
       r.Name, 
       u.UserID, 
       u.RoleID 
       FROM dbo.[Application] a JOIN dbo.[Roles] r ON a.ID = r.ApplicationID 
       JOIN dbo.[UserRoleXRef] u ON u.RoleID = r.ID") 
       .AddEntity("app", typeof(RightsBasedSecurityApplication)) 
       .AddJoin("role", "app.Roles") 
       .AddJoin("user", "role.RightsUsers") 
       .List<RightsBasedSecurityApplication>().AsQueryable(); 

답변

1

방금 ​​발견했습니다. 이것은 조인을 사용하는 것이 더 좋을지라도 충분할 것입니다.

return Session 
      .CreateCriteria<RightsBasedSecurityApplication>() 
      .SetFetchMode("Roles", FetchMode.Select) 
      .List<RightsBasedSecurityApplication>().AsQueryable(); 

public class RightsBasedSecurityApplicationMapping: ClassMap<RightsBasedSecurityApplication> 
{ 
    public RightsBasedSecurityApplicationMapping() 
    { 
     Table("Application"); 
     Id(x => x.ID, "ID");//.Column("ID"); 
     Map(x => x.InternalName); 
     HasMany(x => x.Roles).BatchSize(10); 

public class RoleMapping : ClassMap<Role> 
{ 
    public RoleMapping() 
    { 
     Table("Roles"); 
     Id(x => x.ID, "ID"); 
     References(x => x.Application, "ApplicationID").Not.LazyLoad(); 
     Map(x => x.Name); 
     HasMany(x => x.RightsUsers).Table("UserRoleXRef").BatchSize(100); 
관련 문제