2

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

如果我从不打算进行自动延迟加载,但确实打算有时将该对象与包含一起引入,那么我是否需要这样的虚拟属性:

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

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

4

3 回答 3

1

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

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

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

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

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

祝你好运=D

于 2013-06-26T14:46:41.220 回答
0

如果您没有将导航属性标记为虚拟,例如当您请求用户对象时,db 也会返回相关对象。但是,使用 virtual 时,它会在您明确请求时带来对象。这对性能有好处,因为您可能并不总是需要用户的相关对象或对象的用户。当你需要它们时,你可以使用 .Include() 来带来它们,就像没有 virtual 关键字一样。您应该阅读 EF 中的急切和延迟加载概念以获取更多信息。

于 2013-06-26T14:00:14.950 回答
0

那要看关系。问题与答案相关,答案可以与问题相关。

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

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

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

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

于 2013-06-26T14:06:23.320 回答