Отображение агрегированных объектов Fluent Nhibernate - PullRequest
1 голос
/ 14 августа 2011

Скажем, у меня есть следующий класс с агрегацией внешнего класса:

public class MyMovie
{
    public virtual string id{get;set;}
    public virtual Movie movie{get;set;}
}

//These classes are externally defined and cannot be changed.
public class Movie
{
    public string title{get;set;}
    public IList<Director> Directors{get;set;}
}

public class Director
{
    public string name{get;set;}
    public IList<Movie> DirectedMovies{get;set;}
}

Схема БД для этого будет состоять из трех таблиц:

Фильм (m_id, название)

Директор (d_id, имя)

Направляет (m_id, d_id)

Можно ли сопоставить это с беглым nhibernate? Я просто не понимаю, как это можно сделать с отношением «многие ко многим», находящимся во внешних классах, где я не могу сопоставить создание класса карты для Director, поскольку это не определяет членов как виртуальных.

Ответы [ 2 ]

0 голосов
/ 14 августа 2011

Отобразите свой класс MyMovie как обычно и используйте отключение отложенной загрузки Movie и Director. После всех ленивых загрузок многие-ко-многим должны работать как обычно, повод для сбора лени прокси не нужен.

public class MyMovieMap : ClassMap<MyMovie>
{
    public MyMovieMap()
    {
        Id(x => x.id);
        References(x => x.movie);
    }
}

public class MovieMap : ClassMap<Movie>
{
    public MovieMap()
    {
        Not.LazyLoad();
        Id<int>("m_id");
        Map(x => x.title);
        HasManyToMany(x => x.Directors)
            .Table("Directs")
            .LazyLoad();
    }
}

public class DirectorMap : ClassMap<Director>
{
    public DirectorMap()
    {
        Not.LazyLoad();
        Id<int>("d_id");
        Map(x => x.name);
        HasManyToMany(x => x.DirectedMovies)
            .Table("Directs")
            .LazyLoad();
    }
}
0 голосов
/ 14 августа 2011

По сути, ваша проблема здесь в том, что вы пытаетесь указать nhibernate загрузить объекты, но он ничего не знает об объектах. Например, вы говорите, что MyMovie содержит фильм, но он не знает, к какому полю относится Movie.title, и не знает, как присоединиться к фильмам режиссера, потому что он не сопоставлен. Таким образом, в основном, чтобы осуществить это без файла сопоставления, вам нужно использовать критерии и преобразователи результатов, чтобы выполнить это (в основном, выполняя запрос sql и преобразовывая результаты в объекты с помощью сопоставления «на лету»), вы можете инкапсулировать эту логику в функция, так что она может быть вызвана в вашем коде, не будучи слишком запутанной, но кроме этого я не вижу другого способа обойти это. Посмотрите этот пост, код не совсем то, что вы пытаетесь сделать (потому что вам придется присоединиться к директорам), но он использует те же инструменты, которые вы должны будете использовать ... http://ayende.com/blog/2741/partial-object-queries-with-nhibernate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...