NHibernate CreateSqlQuery и граф объектов - PullRequest
2 голосов
/ 22 января 2010

Здравствуйте, я новичок в NHibernate. Я хотел бы сделать один SQL-запрос к базе данных, используя соединения с моими тремя таблицами.

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

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

[Обновление на основе комментариев Франса в посте Айенде, я думаю, что я хочу сделать, невозможно 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 Ответ

1 голос
/ 22 января 2010

Я только что обнаружил дозирование. Это должно быть достаточно хорошо, хотя лучше использовать соединение.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...