[英]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.