首页 > 解决方案 > 每次我使用多个表时序列化类型对象时检测到循环引用

问题描述

在此处输入图像描述我想从我的控制器返回 json 数据,但我得到的错误是“在序列化类型对象时检测到循环引用”。

到目前为止,我只能从一个名为“Projects”的表中返回数据,但是当我尝试包含我的查找表“ProjectTypes”时,我得到了循环引用。如果有办法返回项目数据及其正确的项目类型,请帮助我。

    public JsonResult getProjects()
    {
        bool proxyCreation = dc.Configuration.ProxyCreationEnabled;
        try
        {
            //set ProxyCreation to false
            dc.Configuration.ProxyCreationEnabled = false;

            var projects = dc.Projects.Include(p => p.ProjectType);

            return Json(projects.ToList(), "application/json", System.Text.Encoding.UTF8, JsonRequestBehavior.AllowGet);

        }

        catch (Exception ex)
        {
            Response.StatusCode = (int)HttpStatusCode.BadRequest;
            return Json(ex.Message);
        }

        finally
        {
            //restore ProxyCreation to its original state
            dc.Configuration.ProxyCreationEnabled = proxyCreation;
        }
    }

下面是我的项目和项目类型类

public partial class Project
    {
        public int ProjectID { get; set; }
        public string Description { get; set; }
        public System.DateTime StartDate { get; set; }
        public Nullable<System.DateTime> EndDate { get; set; }
        public System.DateTime ProjectedEndDate { get; set; }
        public int ProjectTypeID { get; set; }

        public virtual ProjectType ProjectType { get; set; }
    }

 public partial class ProjectType
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public ProjectType()
        {
            this.Projects = new HashSet<Project>();
        }

        public int ProjectTypeID { get; set; }
        public string Description { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Project> Projects { get; set; }
    }

我期望得到的结果是

[{"ProjectID":0,"Description":"看动漫","StartDate":"/Date(1569016800000)/","EndDate":null,"ProjectedEndDate":"/Date(1569016800000)/"," ProjectType":Maintainance,"ProjectType":null},{"ProjectID":1,"Description":"割草","StartDate":"/Date(1569362400000)/","EndDate":null,"ProjectedEndDate" :"/Date(1569448800000)/","ProjectType":Maintainance,"ProjectType":null}]

或 Project 和 ProjectTypes Table 的组合 json 结果,但我得到的实际结果是如上所述的错误消息。

标签: c#asp.net

解决方案


有一个无限循环,其中对象的ProjectType导航属性Project指向其相关ProjectType对象,其Projects导航属性包括Project对象等。

无法禁用此行为,因此避免相关数据无限循环的最佳解决方案是在导航属性到达 JSON 序列化程序之前将其设置为 null 以创建动态类型,以便结果中不包含 null 值,这是我在下面的示例中采用的方法:

    public JsonResult getProjects()
    {
            // Code omitted
            var projects = dc.Projects.Include(p => p.ProjectType)
                 .Select(p => new {
                     Id = p.Id,
                     ProjectType = new {
                         Id = p.ProjectType.Id,
                     }
                 });

            return Json(projects.ToList(), "application/json", System.Text.Encoding.UTF8, JsonRequestBehavior.AllowGet);

    }

第二个选项:(虽然,这只是隐藏了问题,并没有真正解决它。)

services.AddMvc().AddJsonOptions(opts =>
     opts.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);

推荐阅读