初始化具有相互依赖性的对象

本文关键字:依赖性 对象 初始化 | 更新日期: 2023-09-27 18:05:28

我正在尝试从电影数据库建模实体。我有的电影有导演名单,有的导演有电影名单。我制作的对象是这样的:

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。净MVC。

初始化具有相互依赖性的对象

你所做的是一个无限循环,电影添加导演添加电影,直到它抛出StackOverflowException,实体框架"可以"这样做的原因是因为默认情况下实体框架正在做所谓的延迟加载,这意味着当你访问导演列表时,它会调用数据库并获得它们,你的实体现在的方式,但他们将急于加载,因为虚拟关键字是用来让实体框架做延迟加载。

我的建议是,如果你想模仿实体框架的行为是做这样的事情:

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

你可以在Director类中添加一个类似的属性,这样你只在需要的时候才会得到数据,而且它不会为了加载所有的东西而进行无限循环。