2010-12-07 4 views
8

Я использую NH 3.0 и FNH 1.1, перекомпилированные с NH3.NHibernate: не удается успешно загрузить

У меня есть модель пользователя, где я хочу всегда получать ее профиль при загрузке. Я использую провайдера linq из NH3, но не могу использовать его метод Fetch (из-за моего репозитория, который скрывает NHibernate и возвращает IQueryable, и тот факт, что ToPagedList вызывается в запросе, поэтому я не могу помещать Fetch в качестве последнего вызова запроса).

В UserMap я установил:

HasOne(x => x.Profile) 
    .Not.LazyLoad() 
    .Cascade.All(); 

Но установка LazyLoad в положение OFF не помогает. Я тоже играл с режимом выборки.

Мое предположение заключается в том, что если я определяю это сопоставление, то мне даже не нужно указывать Linq, что я хочу получить профиль, когда запрашивается пользовательский объект. Линк должен соблюдать картографию, нет?

+1

hmmm ... Я думал, что 1-к-1 всегда были нетерпеливы ... на самом деле я помню, что не мог лениться загрузить 1 к 1. Это изменилось с NH3? – dotjoe

+0

Моя ссылка - NH Profiler. Я вижу 2 запроса, один выбирает для пользователя и один выбирает для профиля. Должен признаться, я не смотрел на это, когда я использовал NH2. –

ответ

3

У меня возникла проблема, и, к сожалению, я думаю, что это по дизайну. Поставщик NHibernate 3.0 Linq использует HQL под обложками, а HQL не соблюдает ваши сопоставления в этом отношении. Например, если вы сделали

session.CreateQuery («из профиля»). Список()

Вы бы только получить список всех профилей и ваш класс пользователь не войдет даже если ваш отображение имеет внешний-join = true.

Если вы используете старый поставщик NHibernate.Linq, который использовал Critera API, или Criteria API непосредственно:.

session.CreateCriteria() Список()

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

Теперь я не знаю, почему провайдер linq, поддерживаемый HQL, не выполняет ваши сопоставления (и если кто-нибудь знает об этом, напишите), но я считаю, что именно поэтому вы видите это поведение.

Смежные вопросы