【问题标题】:Retrieve Values From List In Entity Framework从实体框架中的列表中检索值
【发布时间】:2017-06-06 03:18:01
【问题描述】:

我的项目中有两种不同的模型:电影和演员。 Movie 有一个演员列表,Actor 有一个电影列表。我想做的是给一部电影,找到所有演员,然后为每个演员检查他们演过的电影。

所以,为了获取信息,我使用:

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

【问题讨论】:

  • 贴出演员和电影类的结构?
  • 什么是key/m.Key?
  • 键值在ModelBase类中,它是一个具有[Key]属性的int。 key是我要获取的电影key,m.Key是给定电影的key。
  • 无法重现,它按预期工作(EF6.1.3)
  • context.Actors.Include("ActingCredits") 是否按预期工作?

标签: c# entity-framework


【解决方案1】:

您没有在包含中键入正确的属性名称。 试试这个:

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

此外,请确保在执行此操作之前填充您的数据库。我对此进行了测试,它可以正常工作,它可以检索所有内容。

【讨论】:

  • 我认为包含是为了将集合/不同的表添加到查询中。在这种情况下,电影有演员,所以我们想包括演员,对吧?上面的代码会引发 500 内部服务器错误,“指定的包含路径无效”
  • 当我只有 Include("Cast") 它说 ActingCredits 是空的。我知道表演学分列表已满,因为我可以在 Actors/ActingCredits 上调用 Get,它会返回完整的电影列表。
  • 我认为您的问题在于您为数据库建模的方式。如果您没有从电影中检索到每个演员的任何电影,那么这意味着您在数据库中没有适当的关系(键/外键)。
  • 我添加了一些数据库用来创建关系的代码。是我错了吗?
  • 您无需指定与 Fluent Api 的关系。没有它,将正确创建 Code First 模型。尝试删除它并在数据库中添加一些带有演员的电影。
【解决方案2】:

问题在于数据库以及我如何初始化它。

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

    }

感谢所有评论的人。我相信我现在对实体框架有了更多的了解。

【讨论】:

  • 酷。根据经验,永远不要重复关系配置。关系(与实体相反)有 2 个端点(实体)并且应该配置一次(以避免错误 - 上面两行完全相同)并且应该准确反映 @ 中导航属性的存在\不存在987654322@ 方法(分别带/不带参数),否则按照惯例 EF 将在您只需要一个的地方创建 2 个关系:)
  • 感谢您的洞察力。我有一种感觉我不需要这两行,但我找不到一个具体的例子来说明这一点。
【解决方案3】:

我建议添加这个:

using System.Data.Entity;

然后您可以使用强类型变量进行包含

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

但是我认为您真正想要的是使用 Select 而不是 Include?​​p>

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-20
    • 2017-03-03
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    相关资源
    最近更新 更多