Хобрук: Ваш путь к мастерству в программировании

System.InvalidOperationException: обнаружена циклическая ссылка

System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: A circular reference was detected while serializing an object of type projectnetwork.Models.Branch.
   at System.Xml.Serialization.XmlSerializationWriter.WriteStartElement(String name, String ns, Object o, Boolean writePrefixed, XmlSerializerNamespaces xmlns)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write7_Branch(String n, String ns, Branch o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write6_Company(String n, String ns, Company o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write7_Branch(String n, String ns, Branch o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write8_Branch(Object o)
   at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
   at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces)
   at System.Web.Services.Protocols.XmlReturnWriter.Write(HttpResponse response, Stream outputStream, Object returnValue)
   at System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues)
   at System.Web.Services.Protocols.WebServiceHandler.Invoke()

Несколько часов назад и до сих пор я не мог решить эту проблему و Я очень устал, и это последний шанс, прежде чем я сойду с ума :) я могу найти кого-то, кто решил эту проблему? то, что я пытаюсь сделать, это вернуть объект ветви типа, который является дочерним элементом, включая объект его родителя, который является компанией.

  • Класс отделения

    public partial class Branch
    {
        public Branch()
        {
            this.Customers = new List<Customer>();
        }
    
            public int BranchID { get; set; }
            public int CompanyID { get; set; }
            public string BranchName { get; set; }
            public string BranchShortName { get; set; }
            public string BranchAddress { get; set; }
            public string BranchPhone { get; set; }
            public string BranchEmail { get; set; }
            public string BranchFax { get; set; }
            public Nullable<float> BranchLimit { get; set; }
            public bool RecordState { get; set; }
            public virtual Company Company { get; set; }        
        }
    
  • Класс компании

    public partial class Company
    {
        public Company()
        {
            this.Branches = new List<Branch>();
        }
    
        public int CompanyID { get; set; }
        public string CompanyName { get; set; }
        public string CompanyShortName { get; set; }
        public string CompanyAddress { get; set; }
        public string CompanyPhone { get; set; }
        public string CompanyEmail { get; set; }
        public string CompanyFax { get; set; }
        public bool RecordState { get; set; }
        public virtual List<Branch> Branches { get; set; }
    }
    
  • Класс NewDBContext

    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using projectnetwork.Models.Mapping;
    
    namespace projectnetwork.Models
    {
    public partial class NewDBContext : DbContext
    {
        static NewDBContext()
        {
            Database.SetInitializer<NewDBContext>(null);
        }
    
        public NewDBContext()
            : base("Name=NewDBContext")
        {
            this.Configuration.LazyLoadingEnabled   = false;
            this.Configuration.ProxyCreationEnabled = false;
        }
    
        public DbSet<Branch> Branches { get; set; }
        public DbSet<Company> Companies { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new BranchMap());
            modelBuilder.Configurations.Add(new CompanyMap());          
        }
    }
    }
    
  • Метод вызова

        [WebMethod]
        public Branch getAllCustomers()
        {
            Branch  br = null;
    
            using (var db = new NewDBContext())
            {
                br = db.Branches
                    .Where(d => d.CompanyID == 1)
                    .Include(c => c.Company)
                    .FirstOrDefault<Branch>();                  
    
    
                return br;
    
            }
    

Извините за мой плохой английский

10.03.2014

  • вы определили публичную виртуальную компанию Company { get; установлен; } в боковых ветвях и общедоступных виртуальных ветках List‹Branch› { get; установлен; } внутри Компании. 10.03.2014
  • @MihaiHantea var collection = br.Select(b =› new { // скопируйте ваши свойства в новый объект }); !!!! не работает 10.03.2014
  • @ray не я, кто определил это, я использовал инструмент работы с фреймами сущностей для создания этих классов 10.03.2014
  • @MihaiHantea Я отключил его, посмотри на класс NewDBContext 10.03.2014
  • @GertArnold посмотри на класс NewDBContext, я его отключил 10.03.2014
  • концептуально Филиал должен содержать только идентификатор компании. С этим идентификатором компании вы сможете получить информацию о компании. 10.03.2014
  • Отмечены ли ваши классы атрибутом DataContract? 10.03.2014

Ответы:


1

Вы можете попробовать добавить атрибут JsonIgnore в свой класс, чтобы остановить его визуализацию, если вы используете Newtonsoft.Json.

public partial class Company
{
    public Company()
    {
        this.Branches = new List<Branch>();
    }

    ....

    [JsonIgnore]
    public virtual List<Branch> Branches { get; set; }

}

10.03.2014
  • Я думаю, что он использует Microsoft.Xml.Serialization, который упоминается в трассировке стека. 11.03.2014

  • 2

    Кажется, вам нужно установить IsReference свойство атрибута DataContract имеет значение true. Некоторые дополнительные сведения приведены здесь.

    [DataContract(IsReference = true)] 
    
    10.03.2014
    Новые материалы

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..

    Раскрытие возможностей НЛП: часть речевой маркировки и ее проблемы
    В сфере обработки естественного языка (NLP) маркировка частей речи (POS) выступает в качестве фундаментального метода, позволяющего компьютерам понимать и анализировать человеческий язык на..

    Под поверхностью: раскрытие деталей системы с помощью инструментов Linux CLI
    Чем больше вы изучаете Linux и продвигаетесь вперед, тем больше вам нужно проверять информацию о вашей системе. Эта информация может касаться аппаратного обеспечения, такого как процессор,..