你好我有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? 我正在尝试虚拟类型,但它没有帮助。
答案 0 :(得分:1)
Question
表中不应该有任何FK,因为FK的shadow属性只在Answer对象的关系的'many'侧创建。
你基本上有two options:
明确加载答案:
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();
在这个有点复杂的语句之后,将使用适当的对象填充所有Answers。请注意FK使用自动处理的阴影属性。有关命名约定的更多信息here。
更容易加急收集:
_context.Question.OrderByDescending(x => x.AddDate).Take(10).Include(x => x.Answers);
在我看来,这更有效,而且只是简单易读且简洁的代码。
此外,值得注意的是此时的EF Core does not support lazy loading。