2011-08-15 111 views
0

我试图从电影数据库中建模实体。我有电影有一个列有导演和导演名单的电影。我所做的对象是这样的:初始化相互依赖的对象

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。

+0

顺便说一句,你可以在Linq2Sql生成的类中执行额外的检查,因为它们是部分实现的,并且有部分方法可以用来获取更改。 –

+0

谢谢,这就是我最初做的。我想我会离开,因为我最终复制了每一个属性,命名开始成为一个真正的痛苦。我可以回过头来看看,但如果没有其他的方法...... –

回答

0

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

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

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

你会那么处长类中添加类似的属性,这样你得到的数据只在你需要它的时候,它不会做一个无限循环来加载所有东西。

+0

啊,我明白了,实际上,只有当我需要的时候,我才能得到所需的数据层。我会试一试。谢谢! –