2011-08-15 156 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

啊,我明白了,實際上,只有當我需要的時候,我才能得到所需的數據層。我會試一試。謝謝! –