2010-01-22 50 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); 
相關問題