Инициирование объектов с взаимозависимостью - PullRequest
0 голосов
/ 15 августа 2011

Я пытаюсь смоделировать сущности из кинобазы. У меня есть фильмы, в которых есть список режиссеров и режиссеров, у которых есть список фильмов. Объекты, которые я сделал, выглядят так:

public class eFilm
{
    //Basic properties
    public int ID { get; private set; }
    public string Title { get; set; }
    public DateTime? Date { get; set; }

    public List<eDirector> Directors = new List<eDirector>();
    public List<eActor> Actors = new List<eActor>();
    public eMedia_Type Type;

    /// <summary>
    /// Initiate a new Films from Films_Data object
    /// </summary>
    /// <param name="Film">Films_Data object from which to initiate a new film</param>
    public eFilm(Film Film)
    {
        this.ID = Film.ID;
        this.Title = Film.Title;
        this.Date = Film.Date;
        this.Synopsis = Film.Synopsis;

        //Add directors
        Film.Films_Directors.Select(fd => fd.Director).ToList<Director>().ForEach(d => this.Directors.Add(new eDirector(d)));
        //Add actors
        Film.Films_Actors.Select(fa => fa.Actor).ToList<Actor>().ForEach(a => this.Actors.Add(new eActor(a)));
        //Add type
        this.Type = new eMedia_Type(Film.Media_Type);
    }
}

public class eDirector
{
    public int ID { get; private set; }
    public string Name{ get; set;}

    public List<eFilm> Films = new List<eFilm>();

    public eDirector(Director Director)
    {
        this.ID = Director.ID;
        this._Name = Director.Name;

        _Number_Of_Films = Director.Films_Directors.Select(d => d.Film).ToList<Film>().ForEach(f => this.Films.Add(new eFilm(f)));
    }
}

Я упустил некоторые вещи для краткости. Это дает мне переполнение стека, потому что я добавляю режиссеров к фильмам, которые затем добавляют фильмы к режиссерам, которые добавляют режиссеров к фильмам и т. Д. Я не могу найти способ смоделировать это, но, очевидно, должен быть какой-то способ сделать это, так как структура сущностей может ...

Любой совет о том, как поступить, будет очень признателен.

РЕДАКТИРОВАТЬ: Некоторая информация, которая может потребоваться. Я делаю это, чтобы добавить слой поверх классов, сгенерированных Linq-to-SQL, чтобы я мог выполнить некоторые проверки данных, прежде чем передать их в хранилище для сохранения. Я использую c # и ASP.NET MVC.

1 Ответ

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

То, что вы сделали, - это неограниченный цикл: фильмы добавляют режиссеров, которые добавляют фильмы до тех пор, пока не генерируется исключение StackOverflowException. Причина, по которой структура сущностей "может" сделать это, заключается в том, что по умолчанию структура сущностей выполняет так называемую ленивую загрузку, котораяозначает, что когда вы обращаетесь к списку директоров, он делает вызов в базу данных и получает их, как ваши сущности сейчас, однако они будут загружать, так как виртуальное ключевое слово используется для того, чтобы структура сущностей выполняла отложенную загрузку.

Я бы предложил, чтобы, если вы хотите имитировать поведение структуры сущностей, нужно сделать что-то вроде этого:

public class Film {
    ...
    public readonly IEnumerable<Director> Directors = _repository.GetDirectors(this.iD);
}

, а затем добавить аналогичное свойство в класс Director, таким образом вы получите данныетолько когда вам это нужно, и он не будет выполнять бесконечный цикл, чтобы все загружать.

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