การอ้างอิงแบบวงกลมและตัวอ่านข้อมูลแบบเปิดใน 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 serializer   -  person DevilSuichiro    schedule 30.12.2017
comment
คุณได้แทนที่วิธี Equals แล้วหรือยัง? คุณช่วยแสดงคอนสตรัคเตอร์ของคอนโทรลเลอร์ของคุณให้เราดูได้ไหม?   -  person Deblaton Jean-Philippe    schedule 30.12.2017
comment
GameController ระดับสาธารณะ: ตัวควบคุม { MyContext สาธารณะ db = new MyContext (); ตัวควบคุมเกมสาธารณะ () { }   -  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