启动具有相互依赖性的对象

时间:2011-08-15 02:07:21

标签: c# oop linq-to-sql entity-framework-4

我正在尝试从电影数据库中建模实体。我的电影有一份导演和导演名单,里面有一系列电影。我制作的物品是这样的:

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 :(得分:0)

你所做的是一个无限循环,电影添加导演添加电影,直到它抛出StackOverflowException,实体框架“可以”这样做的原因是因为默认实体框架正在做所谓的延迟加载,意味着当你访问导演列表时,它会调用数据库并获取它们,就像你的实体现在一样,但是由于虚拟关键字被用来让实体框架进行延迟加载,所以它们会急切加载。

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

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

然后你会在Director类中添加一个类似的属性,这样你只有在你需要的时候才能得到数据,并且它不会进行无限循环以便加载所有内容。