2017-06-05 36 views
0

我的項目中有兩種不同的模型:電影和演員。電影有演員列表,演員有電影列表。 。我想要做的就是給出一個電影,讓所有的演員,然後對每個演員審查擔任他們的電影從實體框架中的列表中檢索值

所以,爲了得到的信息,我用:

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; } 
} 

編輯:它已經到了我的注意,這可能是錯誤的,是問題的原因。

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

很酷。作爲一個經驗法則,永遠不要重複關係配置。這個關係(與實體相對)有兩個端點(實體),並且應該配置一次(以避免錯誤 - 上面兩行完全相同),並且應該精確地反映出「使用'方法(分別帶/不帶參數),否則按照慣例EF將在您只需要一個地方創建2個關係:) –

+1

感謝您的洞察力。我有一種感覺,我不需要兩條線,但我找不到具體的例子。 –

1

您沒有在包含中輸入正確的屬性名稱。此外

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

,請確保您的數據庫執行此之前填充: 試試這個。我測試了這個,它工作,它檢索一切。

+1

我認爲包括是爲收集/不同的表添加到查詢。在這種情況下Movie有Cast,所以我們想要包含Cast,對嗎?上面的代碼會引發500內部服務器錯誤,「指定的包含路徑無效」 –

+0

嗨,我編輯了我的答案以適合您的問題。 – allencage

+0

當我剛剛包含(「Cast」)時,它表示ActingCredits爲空。我知道演員信用列表已滿,因爲我可以調用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);