c# - 为什么 Entity Framework 中的子实体包含引用父实体的虚拟属性?

标签 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 的循环引用错误。

最佳答案

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

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

在更高版本的 Entity Framework 中(我相信从 4 开始),您可以使用不同类型的关联“外键关联”,这将允许您使用外键属性形成关联,这应该允许您删除 Question 导航属性(可能对您有帮助,也可能不会)。

这里有一个更好的解释作为公认的答案:Code First: Independent associations vs. Foreign key associations?

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

祝你好运=D

关于c# - 为什么 Entity Framework 中的子实体包含引用父实体的虚拟属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17320604/

相关文章:

C# linq 更改构造函数无法添加新值

asp.net - asp mvc 从 savechanges() 获取最后一个插入 id

c# - LINQ Lambda 查询 'select' 不适用于 oData

c# - 使用 LINQ 计算乘积

c# - 在 ASP.NET MVC 中使用 LINQ 进行 XML 排序

c# - 按日期排列的列表,将 future 与过去日期分开

c# - 不存在从 ObjectParameter 到已知托管提供程序 native 类型的映射

C# asp.net - 在部署服务器上获取 Windows 用户登录帐户

c# - String、Int32 等类的行为和赋值

c# - 无法通过 sdk 从 cosmos db 中删除特定文档?