NHibernate делает дополнительный выбор на отсутствующие отношения, даже используя нетерпеливую выборку - PullRequest
1 голос
/ 29 июня 2011

Я наткнулся на неожиданное поведение.У нас есть некоторые ссылки в нашей базе данных, которые больше не существуют.Каким-то образом NHibernate преобразует дополнительный запрос на выборку для несуществующих отношений, даже используя загрузку Eager по критериям.

Структура базы данных: Обратите внимание, что UserId 3 в таблице Order больше не существует в Userтаблица.

TableName: Order
+----+-----------+--------+
| Id | OrderName | UserId |
+----+-----------+--------+
| 1  | OrderA    | 1      |
| 2  | OrderB    | 2      |
| 3  | OrderC    | 3      |  
+-------------------------+  

TableName: User
+----+-----------+
| Id | UserName  |
+----+-----------+
| 1  | User1     |
| 2  | User2     |
+----------------+

Отображение NHibernate с Fluent NHibernate:

public class User
{
    public virtual int Id { get; set; }
    public virtual string UserName { get; set; }
}

public class Order
{
    public virtual int Id { get; set; }
    public virtual string OrderName { get; set; }
    public virtual User User { get; set; }
}

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.Id);
        Map(x => x.UserName);
    }
}

public class OrderMap : ClassMap<Order>
{
    public OrderMap()
    {
        Id(x => x.Id);
        Map(x => x.OrderName);
        References(x => x.User).NotFound.Ignore();
    }
}

Критерии NHibernate по заказам Стремительное получение Пользователь:

var orders = session.CreateCriteria<Order>()
    .SetFetchMode("User", FetchMode.Eager)
    .List<Order>();

Результат в выводе:

NHibernate: SELECT this_.Id as Id0_1_, this_.OrderName as OrderName0_1_, this_.U
ser_id as User3_0_1_, user2_.Id as Id1_0_, user2_.UserName as UserName1_0_ FROM
[Order] this_ left outer join [User] user2_ on this_.User_id=user2_.Id

NHibernate: SELECT user0_.Id as Id1_0_, user0_.UserName as UserName1_0_ FROM [Us
er] user0_ WHERE user0_.Id=@p0;@p0 = 3 [Type: Int32 (0)]

Как вы можете видеть, NHibernate выполняет второй запрос по ссылкам пользователя, которые он не может найти, даже если я сделал соединениев таблице User, поэтому он должен уже знать, что запись не существует.Поскольку мы работаем с устаревшей базой данных, на данный момент нет возможности исправить все недостающие отношения внутри нашей базы данных.Есть ли возможность предотвратить такое поведение NHibernate, поскольку это может оказать серьезное влияние на запросы.

Спасибо заранее.

...