Циркулярная ссылка и открытый считыватель данных в Entity Framework

Как я могу решить это в MVC

у меня есть следующая модель данных

public class Game
{
    public int GameID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Player> Players { get; set; 
}

public class Player
{
    public int PlayerID { get; set; }

    public string Name { get; set; }

    public int GameID { get; set; }
    public virtual Game Game { get; set; }
}

В классе Context я создаю оба набора данных

    public DbSet<Game> Games { get; set; }
    public DbSet<Player> Players { get; set; }

Теперь у меня есть простой контроллер MVC, который с помощью Get API должен возвращать набор данных json со списком игр и списком игроков для каждой игры...

Я пробовал эту реализацию контроллера MVC

    public JsonResult Games()
    {
        var Games = db.Games;
        return Json(Games, JsonRequestBehavior.AllowGet);
    }

При этом я получаю сообщение об ошибке, сообщающее мне, что уже есть открытый считыватель данных. Я вроде понимаю, но у меня нет знаний, чтобы решить это.

чтобы решить эту проблему, я попытался поместить ее в список‹>

    public JsonResult Games()
    {
        var Games = db.Games.ToList();
        return Json(Games, JsonRequestBehavior.AllowGet);
    }

В этот момент я получаю циклическую ошибку ссылки. (я думаю, это происходит из виртуальной игры с каждым игроком. но что, если мне это нужно?

как правильно и просто решить эту проблему?

я предполагаю, что это должно быть основной вещью, так как это базовая конфигурация родитель/потомок. но я что-то упускаю.


person Bik Lander    schedule 30.12.2017    source источник
comment
Не могли бы вы добавить, с каким исключением вы столкнулись?   -  person programtreasures    schedule 30.12.2017
comment
в игре есть несколько игроков, которые, в свою очередь, принадлежат к разным играм. EF понятия не имеет, как их вставлять/удалять (определять правильный порядок). Если предполагается, что игра является свойством обратной навигации для игроков, настройте его соответствующим образом. В противном случае удалите путь каскадного удаления, не используя никаких действий при удалении (WillCascadeOnDelete(false)).   -  person DevilSuichiro    schedule 30.12.2017
comment
Обнаружена циклическая ссылка при сериализации объекта типа «System.Data.Entity.DynamicProxies.Game_23DD4D297E2691F50FB8C725AD19E2C8515BFF41849592FD2558443A79BD0918».   -  person Bik Lander    schedule 30.12.2017
comment
Я не собираюсь вставлять или удалять его. я просто хочу получить его DevilCuichiro   -  person Bik Lander    schedule 30.12.2017
comment
это циклическая ссылка при сериализации объекта. В этом случае игнорируйте сериализацию обратного свойства.   -  person DevilSuichiro    schedule 30.12.2017
comment
Каков правильный способ в EF иметь это свойство обратной навигации?   -  person Bik Lander    schedule 30.12.2017
comment
Исключение, с которым вы столкнулись, не имеет ничего общего с EF. Однако вы должны выполнить запрос, прежде чем передавать его сериализатору JSON.   -  person DevilSuichiro    schedule 30.12.2017
comment
Вы переопределили метод Equals? Можете ли вы показать нам конструктор вашего контроллера?   -  person Deblaton Jean-Philippe    schedule 30.12.2017
comment
открытый класс GameController: Controller { public MyContext db = new MyContext(); общедоступный GameController() { }   -  person Bik Lander    schedule 30.12.2017


Ответы (2)


Ошибка круговой ссылки обычно появляется, когда мы плохо проектируем наши объекты. Это что-то вроде у нас

public class Bank
{
    public int Id;
    public string Name;
}

public class BankBranch
{
   public int Id;
   public string BranchName;
   public int BankId { get; set; }
   [ForeignKey("BankId")]
   public virtual Bank Bank { get; set; }
}

Когда мы создаем сущность компании и пытаемся добавить как Bank, так и BankBranch IDs в эту сущность компании, VS выдает ошибку при добавлении или обновлении миграции из-за нескольких точек перехода для сущности Bank. Если у нас есть дизайн, как показано ниже

public class Company
{
   public int Id;
   public int BankBranchId { get; set; }
   [ForeignKey("BankBranchId")]
   public virtual BankBranch BankBranch { get; set; }
}

мы можем связаться с отделением от компании и банком с отделения следующим образом: company.BankBranch.Bank.

Даже если у нас хорошо структурированный дизайн, EF может выдать эту ошибку. Я просто использую атрибут ProxyCreationEnable для получения данных Json из контроллера.

public JsonResult GetAllBankList()
{
   db.Configuration.ProxyCreationEnabled = false;
   var bankList = db.Banks.ToList();
   return Json(bankList, JsonRequestBehavior.AllowGet);
}
person Murat Seker    schedule 30.12.2017

Вы можете отключить прокси, чтобы избежать циклических ссылок.

YourDbContext.Configuration.ProxyCreationEnabled = false;
YourDbContext.Configuration.ProxyCreationEnabledLazyLoadingEnabled = false;
person Leo M    schedule 30.12.2017