2010-01-22 2 views
2

Привет, я новичок в NHibernate. Я хотел бы сделать один запрос sql к базе данных, используя объединения к моим трем таблицам.NHibernate CreateSqlQuery и граф объектов

У меня есть приложение со многими ролями со многими пользователями. Я пытаюсь заставить NHibernate правильно сформировать граф объектов, начиная с объекта Application. Например, если у меня есть 10 записей приложений, я хочу 10 объектов приложения, а затем эти объекты имеют свои роли, которые имеют своих пользователей. Однако то, что я получаю, похоже на декартово произведение, в котором у меня столько объектов приложения, сколько полных записей пользователя.

Я изучил это довольно немного и не уверен, правильно ли сформировать иерархию приложений. Я могу получить только сплющенные объекты. Это кажется «возможно» возможным, как в моих исследованиях, которые я прочитал о «сгруппированных соединениях» и «иерархическом выходе» с предстоящим выпуском LINQ to NHibernate. Опять же, хотя я новичок.

[Обновление на основе Frans комментарий в посте 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); 
Смежные вопросы