实体框架不会从相关的表中获取数据

时间:2016-09-26 13:22:48

标签: .net entity-framework asp.net-core

你好我有EntityFramework的问题。我和一对多有关系。

public class Question
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    public string Description { get; set; }

    [Required]
    public DateTime AddDate { get; set; }

    [Required]
    public string Author { get; set; }

    [Required]
    public bool IsApproved { get; set; } = false;

    public ICollection<Answer> Answers { get; set; }
}

和secound class:

public class Answer
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Text { get; set; }
    [Required]
    public string FileName { get; set; }

    public Question Question { get; set; }
}

我们如何看待我在这些表之间设置关系。 不幸的是,当我做简单选择时

_context.Question.OrderByDescending(x => x.AddDate).Take(10)

Answers对象始终为null。 我检查了MSSQL中的Keys。问题表没有任何FK到答案,但答案有FK问题。

有人可以帮我解释一下我做错了什么吗?为什么没有创建FK? 我正在尝试虚拟类型,但它没有帮助。

1 个答案:

答案 0 :(得分:1)

Question表中不应该有任何FK,因为FK的shadow属性只在Answer对象的关系的'many'侧创建。

你基本上有two options

  1. 明确加载答案:

    var questions = _context.Question.OrderByDescending(x => x.AddDate).Take(10);
    _contest.Answer.Where(x => questions.Select(q => q.Id)
                               .Contains(EF.Property<int>(x, "QuestionId"))).Load();
    
  2. 在这个有点复杂的语句之后,将使用适当的对象填充所有Answers。请注意FK使用自动处理的阴影属性。有关命名约定的更多信息here

    1. 更容易加急收集:

      _context.Question.OrderByDescending(x => x.AddDate).Take(10).Include(x => x.Answers);
      
    2. 在我看来,这更有效,而且只是简单易读且简洁的代码。

      此外,值得注意的是此时的EF Core does not support lazy loading