Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测到自参考循环_C#_Entity Framework_Azure_Asp.net Web Api - Fatal编程技术网

C# 检测到自参考循环

C# 检测到自参考循环,c#,entity-framework,azure,asp.net-web-api,C#,Entity Framework,Azure,Asp.net Web Api,我以前读过很多关于这个问题的解决方案,但没有一个对我有效 我在事件和用户对象之间有一个循环关系: public class Event : EntityData { [Required] [ForeignKey("Creator")] public string CreatorId { get; set; } public User Creator { get; set; } [InverseProperty("ParticipantIn")]

我以前读过很多关于这个问题的解决方案,但没有一个对我有效

我在事件和用户对象之间有一个循环关系:

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; }
}

以避免自引用循环

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

提前感谢,,
丽兰

我读到这是一种方法

MyContextEntities.ContextOptions.ProxyCreationEnabled = false;

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

因为您将集合指定为
virtual
,Entity Framework延迟加载相关实体,这些实体正在使用循环引用构建对象,而WebAPI JSON序列化程序并不特别适合使用循环引用

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

MyEntities.Configuration.LazyLoadingEnabled = false;
或者,如果需要,从属性声明中删除
virtual
关键字。使用这两个选项中的任何一个,如果需要,您可以使用
Include
扩展方法加载相关集合,如下所示:

MyEntities.Set<Users>()
  .Include(u => u.ManagerIn)
  .Include("ParticipantIn");
MyEntities.Set()
.包括(u=>u.ManagerIn)
。包括(“参与者”);
(上面显示了使用Include加载的两个选项)

Load
方法也可用于显式加载相关实体。包含与加载时是否存在堆栈溢出

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

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


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

您使用什么来序列化它?如果您使用的是XML,可能与JSON相关,可能对JSON感兴趣,也可能有其他的重复。向我们展示您的序列化代码和您的问题的一个最小完整示例(即给我们一个程序,该程序使用循环引用创建这些对象,然后使用您正在使用的任何方法对它们进行序列化,这样我们就可以准确地了解您正在做什么以及错误是如何产生的,b)轻松地修改代码以使其工作,而不必自己编写代码来确认我们建议的任何解决方案。嗨,伙计!谢谢你具体的回答。但不管我做什么,我还是会犯这个错误。让我给你举个例子。在我的create event函数中,我正在执行var inserted=context.Events.Add(event);这将添加事件,然后我将查找使用var creator=wait context.Users.FindAsync(新对象[]{creatorId})创建事件的用户;,我这样做是为了执行creator.ManagerIn.Add(created);所以这件事会在他的名单上。当我加载creator对象时,插入的对象现在就包含对有事件引用的creator的循环引用等。。。
MyContextEntities.ContextOptions.ProxyCreationEnabled = false;
MyEntities.Configuration.LazyLoadingEnabled = false;
MyEntities.Set<Users>()
  .Include(u => u.ManagerIn)
  .Include("ParticipantIn");