NHibernate Linq свойство-ref поведение - PullRequest
0 голосов
/ 02 июня 2011

NHibernate Linq выдает необъявленный запрос.Вот мои отображения классов:

public class OrderClassMap : ClassMap<Order> {
    public OrderClassMap() {
        Id(x => x.PersistenceId).Column("RowId").GeneratedBy.Assigned();
        Version(x => x.PersistenceVersion).Column("RowVersion");
        Map(x => x.OrderId).Generated.Insert().Not.Update();
        Map(x => x.OrderDate);
        References(x => x.Overseer).Column("OverseerId").PropertyRef(x => x.OverseerId);
        References(x => x.Overseer2).Column("OverseerId2").PropertyRef(x => x.OverseerId2);
    }
}

public class OverseerClassMap : ClassMap<Overseer> {
    public OverseerClassMap() {
        Id(x => x.PersistenceId).Column("RowId").Generated.Assigned();
        Version(x => x.PersistenceVersion).Column("RowVersion");
        Map(x => x.OverseerId).Generated.Insert().Not.Update();
        Map(x => x.Name);
        Map(x => x.Email);
    }
}

Вот запрос Linq, который у меня есть:

var orders = session.Query<Order>()
                    .Where(o => ((o.Overseer.OverseerId == 1) || (o.Overseer.OverseerId == 2)))
                    .Fetch(o => o.Overseer)
                    .Fetch(o => o.Overseer2);

Сгенерированный SQL-запрос не тот, который я ожидал.Вместо того, чтобы делать левое внешнее соединение, оно делает декартово соединение.Вот сокращенный пример запроса, который производит NHibernate:

SELECT ...
FROM Orders o LEFT OUTER JOIN
     Overseers v1 ON o.OverseerId = v1.OverseerId LEFT OUTER JOIN
     Overseers v2 ON o.OverseerId2 = v1.OverseerId,
     Overseers v3,
     Overseers v4
WHERE o.OverseerId = v3.OverseerId AND
      o.OverseerId2 = v4.OverseerId AND
      (v3.OverseerId = 1 OR v4.OverseerId = 1)

Запрос, который я ожидал, будет выглядеть так:

SELECT ...
FROM Orders o LEFT OUTER JOIN
     Overseers v1 ON o.OverseerId = v1.OverseerId LEFT OUTER JOIN
     Overseers v2 ON o.OverseerId2 = v1.OverseerId
WHERE (v1.OverseerId = 1 OR v2.OverseerId = 1)

Я думаю, что это происходит потому, что у меня есть устаревшая база данныхЯ использую PropertyRef в моем отображении.Есть ли способ исправить это неожиданное поведение?Почему NHibernate ведет себя так?Это не имеет смысла для меня, потому что, указав PropertyRef, я говорю: «Используйте этот ключ вместо первичного ключа».

Ответы [ 2 ]

0 голосов
/ 02 июня 2011

Я не совсем уверен, что понимаю, чего вы пытаетесь достичь, но мне кажется, что вы неправильно поняли отображения PropertyRef.

Если вы хотите, чтобы OverseerId и OverseerId2 в Order для столбца OvreseerId в таблице Overseers, то свойство-ссылка должно быть OverseerId в обоих случаях:

References(x => x.Overseer).Column("OverseerId").PropertyRef(x => x.OverseerId);
References(x => x.Overseer2).Column("OverseerId2").PropertyRef(x => x.OverseerId);
0 голосов
/ 02 июня 2011

Попробуйте использовать QueryOver <> и укажите левое внешнее соединение.

...