Member 13200081 Ответов: 1

Как я могу правильно вернуть результат json, который включает в себя две или более таблиц?


Я хотел бы вернуть данные json из моего контроллера, но получаю ошибку: "при сериализации объекта типа была обнаружена циклическая ссылка".

До сих пор я могу возвращать данные только из одной таблицы под названием "проекты", но когда я пытаюсь включить свою поисковую таблицу "ProjectTypes", я получаю циклическую ссылку. если есть способ вернуть данные проектов и их правильный тип проекта, пожалуйста, любезно помогите мне.

Что я уже пробовал:

Это то, что я пытался, но .Include действительно работает с return json.

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

Richard MacCutchan

Сообщение об ошибке говорит вам, что objecta содержит ссылку на objectb, которая содержит ссылку обратно на objecta. Поэтому попытка сериализовать это приведет к бесконечному циклу.

1 Ответов

Рейтинг:
0

RickZeeland

Я думаю, что проблема заключается в вашем классе ProjectType, который имеет строку

this.Projects = new HashSet<Project>();
Взгляните на это Выравнивание Типов Коллекций в этой статье: Работа с JSON в C# и VB[^]