2010-01-22 64 views
2

你好,我是NHibernate的新手。我想使用连接到我的三个表中的一个SQL查询到数据库。NHibernate的CreateSqlQuery和对象图

我有许多用户与许多角色的应用程序。我试图让NHibernate正确地形成以Application对象开始的对象图。例如,如果我有10个应用程序记录,我需要10个应用程序对象,然后这些对象具有其用户的角色。然而,我得到的结果类似于笛卡尔产品,其中我拥有与总用户记录一样多的应用程序对象。

我已经仔细研究了这一点,不确定是否可以正确构建应用程序层次结构。我只能让扁平的物体回来。看起来“也许”是可能的,因为在我的研究中,我已经阅读了关于“分组连接”和“分层输出”的一个即将到来的LINQ to NHibernate版本。虽然我是一个新手。

[更新基于对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); 
相关问题