2011-08-15 13 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))); 
    } 
} 

私は簡潔にするため、いくつかのものを省略しました。これは映画にディレクターを追加して映画にディレクターを追加する映画にディレクターを追加するので、私はスタックのオーバーフローをもたらします。 私はこれをモデル化する方法を理解できませんが、明らかにこれを行うための何らかの方法が必要ですエンティティフレームワークは...

進める方法についてのアドバイスは大歓迎です。

EDIT:必要な情報があります。私は、永続性のためにリポジトリに渡す前に、Linq-to-SQLによって生成されたクラスの上にレイヤを追加して、データのチェックをいくつか実行できるようにしています。私はC#とASP.NET MVCを使用しています。

+0

Btwの場合、Linq2Sqlで生成されたクラスでは、部分的に実装されているため、追加のチェックを行うことができます。 –

+0

ありがとう、それは私が本来行っていたことです。すべての物件を複製して名前をつけることが本当に苦しいものになったので、私はそれから離れると思った。他の方法がない場合は、私はそれに戻るかもしれません... –

答えて

0

あなたがしたことは無限ループです。映画はStackOverflowExceptionをスローするまで映画を追加するディレクターを追加しています。エンティティフレームワークがこれを行うことができるのは、デフォルトでエンティティフレームワークが遅延読み込みディレクターのリストにアクセスすると、データベースへの呼び出しが行われ、エンティティフレームワークの遅延読み込みにvirtualキーワードが使用されているため、エンティティの現在の状態になります。

私の提案は、あなたは、エンティティフレームワークの動作を真似したい場合は、このような何かをしているということでしょう

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

あなたは、その後、ディレクタークラスであなたが得るこの方法を同様のプロパティを追加しますあなたがそれを必要としているときにだけデータを取得し、すべてを熱心にロードするために無限ループを行うことはありません。

+0

ああ、私は、私が必要とする場合、私が必要とするデータのレイヤーを効果的に取得します。私はそれを試してみましょう。ありがとう! –

関連する問題