2017-06-05 22 views
0

私のプロジェクトには、MovieとActorという2つの異なるモデルがあります。ムービーにはアクターのリストがあり、アクターにはムービーのリストがあります。私がやりたいことは映画を与えている、俳優の全てを取得し、各俳優のために彼らの映画を調べるに出演Entity Frameworkのリストから値を取得

をので、情報を得るために、私が使用します。

var movie = context.Movies.Include("Cast.ActingCredits").FirstOrDefault(m => m.Key == key); 

問題リストActingCreditsがヌルではない間に値が存在しないということです。リストに値をロードするために欠けているものがありますか? ActingCreditsICollection<Movie>です。

public class Actor : ModelBase 
{ 
    public ICollection<Movie> ActingCredits { get; set; } 
} 

public class Movie : ModelBase 
{ 
    public string Title { get; set; } 
    public DateTime Year { get; set; } 
    public Genre Genre { get; set; } 
    public int RunTime { get; set; } 
    public int Sales { get; set; } 
    public ICollection<Actor> Cast { get; set; } 
} 

EDIT:これは間違っているかもしれというのが私の注意に来て、問題の原因であるしています。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Movie>().HasMany(p => p.Cast).WithMany(); 
     modelBuilder.Entity<Actor>().HasMany(m => m.ActingCredits).WithMany(); 
    } 
+0

俳優クラスと映画クラスの構造を投稿しますか? – Trey

+0

キー/ m.Keyとは何ですか? – David

+0

キー値はModelBaseクラスにあり、 '[Key]'属性を持つintです。 Keyは取得したいムービーキー、m.Keyは指定されたムービーのキーです。 –

答えて

1

問題はデータベースとどのように初期化したかで問題になりました。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Movie>().HasMany(p => p.Cast).WithMany(p => p.ActingCredits); 
     modelBuilder.Entity<Actor>().HasMany(m => m.ActingCredits).WithMany(m => m.Cast); 

    } 

コメントしたすべての方に感謝します。私はエンティティのフレームワークを今よりずっと理解していると思います。

+1

Cool。経験則として、決して関係設定を複製しないでください。 (エンティティとは対照的に)関係は2つの終端(エンティティ)を持ち、一度設定する必要があります(エラーを避けるために、上記の2行はまったく同じものです)。そして、 With'メソッドを使って(それぞれ引数がある場合とない場合)、それ以外の場合はEFは2つの関係を作成します。 –

+1

その洞察に感謝します。私は両方の線が必要ではないという気持ちがありましたが、そうする具体的な例は見つかりませんでした。 –

1

インクルードにプロパティの正しい名前を入力していません。 これを試してみてください:

また
var movie = context.Movies.Include("Cast").FirstOrDefault(m => m.Key == key); 

、データベースがこれを実行する前に移入されていることを確認してください。私はこれを試して動作し、すべてを取得します。

+1

私は、コレクションにコレクション/別のテーブルを追加するためのインクルードを考えました。この場合、ムービーにキャストがあるので、キャストを含めたいと思いますか?上のコードは、500内部サーバーエラー "指定されたインクルードパスが有効ではありません" –

+0

こんにちは、私はあなたの問題に合わせて私の答えを編集します。 – allencage

+0

私はちょうどインクルード( "キャスト")があるとき、それはActingCreditsがnullだと言います。 Get actors/ActingCreditsを呼び出すことができ、映画の完全なリストを返すので、演技のクレジットのリストがいっぱいです。 –

0

私はこの追加することをお勧め:

using System.Data.Entity; 

をそして、あなたは強く型付けされた変数

var movie = context.Movies.Include(r => r.Cast) 

しかし、私はあなたが本当に欲しいと思うものを選択]を使用しての代わりに含めることです

を含めることができますか?

var movie = context.Movies.Select(r => r.Cast).SelectMany(r => r.ActingCredits);