Рассмотрим следующую упрощенную область:жадная загрузка дополнительный один-к-одному с NHibernate
public class Movie
{
public virtual int Id { get; set; }
public virtual MovieDetail MovieDetail { get; set; }
}
public class MovieDetail
{
public virtual int Id { get; set; }
public virtual Movie Movie { get; set; }
}
MovieDetail
не может существовать без Movie
, но Movie
может существовать без MovieDetail
(то есть у нас нет никаких подробностей о Это).
Наша база данных имеет отдельную таблицу для Movie
с колоннами Id
и отдельную таблицу для MovieDetail
с колоннами Id
и MovieId
. Существует также внешний ключ от MovieDetail.MovieId
до Movie.Id
.
У нас есть все, что отображается в NHibernate, но при получении коллекции Movie
экземпляров мы хотим, чтобы левое внешнее соединение было MovieDetail
. Если нет, у нас может возникнуть проблема с N + 1 при итерации по экземплярам Movie
. Это имеет место сейчас: есть отдельный запрос для каждого вызова свойства Movie.MovieDetail
.
Я пробовал сопоставление one-to-one
, но это похоже на случай, когда у вас есть оба экземпляра. В нашем случае у нас не всегда есть MovieDetail
. Кроме того, они не используют один и тот же первичный ключ.
Я исследовал формулу, но это потребовало бы, чтобы мой MovieDetail
реализовал IUserType
, по сути поставив NHibernate в мой домен. Я бы хотел этого избежать.
Я не мог заставить его работать. Возможно, наш домен имеет что-то экзотическое (я его упростил). Свойства действительно должны быть виртуальными (они были). – Peter