实体框架中的自我引用6代码优先

本文关键字:代码 引用 自我 框架 实体 | 更新日期: 2023-09-27 18:09:57

我的代码中有这些类:

public class Parent
{
    [Key]
    public int ParentID { get; set; }
    public string ParentName { get; set; }
    public virtual ICollection<Child> Childs { get; set; }
}
public class Child
{
    [Key]
    public int ChildID { get; set; }
    public string ChildName { get; set; }
    public int ParentID { get; set; }
    [ForeignKey("ParentID")]
    public virtual Parent Parent { get; set; }
}

ParentChild具有一对多关系,Child具有Parent性质。这将来会给我带来麻烦吗?因为当我试图用Newtonsoft将这个类转换为JObject时,我刚刚得到了Self referencing loop detected异常。我是否应该从Child中删除Parent属性,这样就不会导致自我引用?

实体框架中的自我引用6代码优先

问题是,当您去序列化这些类中的任何一个时,您确实有一个循环引用。父节点有一个子节点列表,这些子节点依次链接回父节点。

JsonIgnoreAttribute修饰Child.Parent,它将停止尝试序列化此属性。它作为导航属性肯定很有用,但我想不出一个实际的情况,你想要整个Parent对象序列化为Child的成员。(保留父节点的id可能有用)

有两种方法来处理这个错误。首先,你可以忽略导航属性(virtual iccollection)。因为。这是用于导航和序列化效果的

自引用循环检测到异常

这发生在Newtonsoft或XmlSerializer。

第二,可以使用不带代理的POCO类来序列化。