【问题标题】:Circular Reference and Open datareader in Entity Framework [duplicate]实体框架中的循环引用和打开数据读取器 [重复]
【发布时间】:2018-06-10 16:23:19
【问题描述】:

如何在 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);
    }

那时我得到一个循环引用错误。 (我猜它来自每个玩家的虚拟游戏。但如果我需要呢?

解决这个问题的正确和简单的方法是什么?

我想它必须是基本的东西,因为它是基本的父/子配置。但我错过了一些东西。

【问题讨论】:

  • 你能补充一下你面临的异常吗?
  • 一个游戏有多个玩家,然后他们又属于不同的游戏。 EF 不知道如何插入/删除它们(确定正确的顺序)。如果游戏应该是玩家的反向导航属性,那么配置它。否则,使用 on delete no action (WillCascadeOnDelete(false)) 删除级联删除路径。
  • 在序列化“System.Data.Entity.DynamicProxies.Game_23DD4D297E2691F50FB8C725AD19E2C8515BFF41849592FD2558443A79BD0918”类型的对象时检测到循环引用。
  • 我不想插入或删除它。我只是想找回它 DevilCuichiro
  • 您面临的异常与EF无关。不过,您应该先执行查询,然后再将其提供给 JSON 序列化程序。

标签: c# json asp.net-mvc entity-framework parent-child


【解决方案1】:

当我们糟糕地设计实体时,通常会出现循环引用错误。就像我们有的一样

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

当我们创建公司实体并尝试在该公司实体中添加BankBankBranch IDs 时,由于Bank 实体的多个跳转点,VS 在添加或更新迁移时出错。如果我们有如下设计

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

【讨论】:

    【解决方案2】:

    您可以关闭代理以避免循环引用。

    YourDbContext.Configuration.ProxyCreationEnabled = false;
    YourDbContext.Configuration.ProxyCreationEnabledLazyLoadingEnabled = false;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 2018-09-07
      相关资源
      最近更新 更多