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

时间:2013-06-26 12:53:33

标签: c# linq entity-framework entity-framework-4

我有以下用于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; }

如果我从不打算进行自动延迟加载但是有时打算用include包含该对象,那么我是否需要这样的虚拟属性:

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

我问的原因是因为当与Web API一起使用时,它给了我json的循环引用错误。

3 个答案:

答案 0 :(得分:2)

在不查看映射配置的情况下,我可能会做一些假设,但我怀疑您使用Independent Association来定义实体之间的关联关系。

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

在Entity框架的更高版本中(我相信4以后),您可以使用不同类型的关联“外键关联”,这将允许您使用外键属性形成关联,这应该允许您删除{ {1}}导航属性(可能会或可能不会帮助您)。

这里有一个更好的解释,即接受的答案:Code First: Independent associations vs. Foreign key associations?

那就是说,如果您的关联工作正常,那么您的问题可能就在于您当时如何使用您的实体/ Web API(我不太了解其评论)。

祝你好运= D

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这取决于关系。问题与答案有关,答案可能与问题有关。

我不知道你的模特是什么,但提出我的观点。

答案可能有两个回答“白色”和“颜色白色”。

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

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