繁体   English   中英

检测到自引用循环

[英]Self referencing loop detected

我已经阅读了很多以前针对该问题的解决方案,但没有一个对我有用。

我在Event和User对象之间有一个循环关系:

public class Event : EntityData
{
    [Required]
    [ForeignKey("Creator")]
    public string CreatorId { get; set; }
    public User Creator { get; set; }

    [InverseProperty("ParticipantIn")]
    public virtual ICollection<User> Participants { get; set; }

    [InverseProperty("ManagerIn")]
    public virtual ICollection<User> Managers { get; set; }
}

如您所见,我从该类中有3个对User的引用:事件创建者,管理者列表和参与者列表。

用户类还包含对Event的引用:

public class User: EntityData
{
    [InverseProperty("Participants")]
    public virtual ICollection<Event> ParticipantIn { get; set; }

    [InverseProperty("Managers")]
    public virtual ICollection<Event> ManagerIn { get; set; }
}

现在的问题是,当我尝试序列化事件时(例如在createEvent函数中),它告诉我存在一个自引用循环,这是因为在创建事件时,我将其添加到创建者的'ManagerIn'中采集。

该行导致事件->创建者-> ManagerIn->事件->创建者-> .....

我尝试了任何事情,我还通过公共虚拟用户创建者使用了此代码的一个版本,以使其延迟加载。

目前,在将事件返回给我正在执行的客户端之前,我的解决方案还不够完善:

event.Creator = null;

event.Managers = null;

为了避免自引用循环。

解决此类问题的正确方法是什么?

在此先感谢Liran!

我读过这是这样做的一种方式。

MyContextEntities.ContextOptions.ProxyCreationEnabled = false;

否则,我建议序列化到另一个对象,并避免序列化您的poco。

因为您将集合指定为virtual ,所以实体框架是延迟加载相关的实体,该实体正在使用循环引用构建对象,WebAPI JSON序列化器不能很好地配合使用。

您可以使用以下特定查询禁用延迟加载:

MyEntities.Configuration.LazyLoadingEnabled = false;

或者,如果您想从属性声明中删除virtual关键字。 使用这些选项之一,然后可以根据需要使用Include扩展方法来急于加载相关集合,如下所示:

MyEntities.Set<Users>()
  .Include(u => u.ManagerIn)
  .Include("ParticipantIn");

(以上显示了使用“包含到急切加载”中的两个选项)

Load方法还可用于显式加载相关实体。 是包含与加载的堆栈溢出

我还做了与您为将相关实体集合设置为null所指定的相似的操作,以防止将其包含在序列化中。 为此,我建议先将您的POCO /实体映射到DTO(数据传输对象),以便您可以设置可重复的内容,避免在同一上下文中意外调用SaveChanges()并无意间删除SQL中的实体之间的关系。 Automapper是一个现有的解决方案,可以将其映射到DTO,或者您可以编写自己的Mapper实用程序类来给自己更多的控制权。

最后一个可能的选项(我知道)是调整HttpConfiguration.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandinging设置以忽略对所有/数组/对象的引用处理。

这实际上取决于您的要求和其余代码。 希望其中之一能引导您走上正确的道路,祝您好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM