为什么实体框架中的子实体包含引用父实体的虚拟属性

本文关键字:实体 属性 引用 虚拟 框架 为什么 包含 | 更新日期: 2023-09-27 18:19:54

我在EF5 中使用了以下类

 public class Question
 {
    public Question()
    {
        this.Answers = new List<Answer>();
    } 
    public int QuestionId { get; set; }
    ...
    ...
    public string Title { get; set; }
    public virtual ICollection<Answer> Answers { get; set; }
}
public class Answer
{
    public int AnswerId { get; set; }
    public string Text { get; set; }
    public int QuestionId { get; set; }
    public virtual Question Question { get; set; }
}

有人能告诉我为什么需要这处房产吗:

public virtual Question Question { get; set; }

如果我从未打算进行自动lazyloading,但有时确实打算将该对象包含在内,那么我需要这样的虚拟属性吗:

        var questions = _questionsRepository.GetAll()
            .Include(a => a.Answers);

我之所以这么问,是因为当与Web API一起使用时,它会给我json的循环引用错误。

为什么实体框架中的子实体包含引用父实体的虚拟属性

如果不查看映射配置,我可能会有一些假设,但我怀疑您正在使用独立关联来定义实体之间的关联关系。

这是实体框架的一个功能,在实体框架中,对象之间的关系被建模为引用,因此您实际上不需要外键属性出现在对象上;这确实意味着您的两个实体都需要定义一个导航属性,因此EntityFramework能够管理关联。在您的情况下,您需要在Answers实体上具有Question属性。

在Entity框架的后续版本(我相信从4开始)中,您可以使用不同类型的关联"外键关联",这将允许您使用外键属性形成关联,这将使您可以删除Question导航属性(这可能对您有帮助,也可能对您没有帮助)。

这里有一个更好的解释作为公认的答案:代码优先:独立协会与外国关键协会?

也就是说,如果你的关联工作正常,你的问题可能是你如何使用你的实体/Web API(我不太了解,无法对此发表评论)。

祝你好运=D

如果不将导航属性标记为虚拟,例如,当您请求User对象时,db也会返回相关的object。然而,对于虚拟,当您明确请求对象时,它会带来对象。出于性能原因,这是很好的,因为您可能不需要始终为用户或为对象使用相关的对象。当你需要它们时,你可以使用.Include()来带来它们,就像没有虚拟关键字一样。你应该阅读EF中关于急切和懒惰加载的概念,了解更多信息。

这取决于关系。问题与答案相关,答案可以与问题相关。

我不知道你的模型是什么,但我想谈谈我的观点。

答案可能有两个答案"白色"answers"白色"

人类对#FFFFFF的定义是什么?雪的颜色是什么?

两个问题都符合两个答案。所以我们有关系。