2017-06-05 76 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);