Referensi Melingkar dan Pembaca data terbuka di Entity Framework [duplikat]

Bagaimana saya bisa mengatasi ini di MVC

saya memiliki model data berikut

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

Di kelas Konteks saya membuat kedua kumpulan data

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

Saya sekarang memiliki pengontrol MVC sederhana yang melalui Get API harus mengembalikan kumpulan data json dengan daftar Game dan per Game daftar Pemain...

Saya mencoba implementasi pengontrol MVC ini

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

Dengan ini, saya mendapat pesan kesalahan yang memberi tahu saya bahwa sudah ada pembaca data yang terbuka. Saya agak memahaminya, tetapi saya tidak memiliki pengetahuan untuk menyelesaikannya.

untuk mengatasinya saya mencoba memasukkannya ke dalam Daftar‹>

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

Pada saat itu saya mendapatkan kesalahan referensi melingkar. (Saya kira itu berasal dari Game virtual dengan masing-masing Pemain. tetapi bagaimana jika saya membutuhkannya?

apa cara yang benar dan sederhana untuk mengatasi masalah ini?

saya kira itu harus menjadi hal mendasar karena ini merupakan konfigurasi dasar orang tua/anak. tapi aku melewatkan sesuatu.


person Bik Lander    schedule 30.12.2017    source sumber
comment
Bisakah Anda menambahkan pengecualian mana yang Anda hadapi?   -  person programtreasures    schedule 30.12.2017
comment
sebuah game memiliki banyak pemain, yang kemudian menjadi anggota game yang berbeda. EF tidak tahu cara memasukkan/menghapusnya (menentukan urutan yang benar). Jika game seharusnya menjadi properti navigasi terbalik bagi pemain, konfigurasikan seperti itu. Jika tidak, hapus jalur penghapusan berjenjang dengan menggunakan tindakan tanpa penghapusan (WillCascadeOnDelete(false)).   -  person DevilSuichiro    schedule 30.12.2017
comment
Referensi melingkar terdeteksi saat membuat serial objek bertipe 'System.Data.Entity.DynamicProxies.Game_23DD4D297E2691F50FB8C725AD19E2C8515BFF41849592FD2558443A79BD0918'.   -  person Bik Lander    schedule 30.12.2017
comment
Saya tidak ingin menyisipkan atau menghapusnya. aku hanya ingin mengambilnya DevilCuichiro   -  person Bik Lander    schedule 30.12.2017
comment
ini adalah referensi melingkar saat membuat serial objek. Abaikan serialisasi properti invers dalam kasus tersebut.   -  person DevilSuichiro    schedule 30.12.2017
comment
Apa cara yang benar di EF untuk memiliki properti navigasi terbalik?   -  person Bik Lander    schedule 30.12.2017
comment
Pengecualian yang Anda hadapi tidak ada hubungannya dengan EF. Anda harus menjalankan kueri sebelum memberikannya ke serializer JSON.   -  person DevilSuichiro    schedule 30.12.2017
comment
Sudahkah Anda mengganti metode Equals? Bisakah Anda menunjukkan kepada kami konstruktor pengontrol Anda?   -  person Deblaton Jean-Philippe    schedule 30.12.2017
comment
kelas publik GameController : Pengendali { public MyContext db = new MyContext(); GameController publik() {} }   -  person Bik Lander    schedule 30.12.2017


Jawaban (2)


Kesalahan referensi melingkar umumnya muncul ketika kita mendesain entitas kita dengan buruk. Itu adalah sesuatu seperti yang kita miliki

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

Saat kita membuat entitas perusahaan dan mencoba menambahkan Bank dan BankBranch IDs di entitas perusahaan ini, VS memberikan kesalahan saat menambahkan atau memperbarui migrasi karena beberapa titik lompatan untuk entitas Bank. Jika kita mempunyai desain seperti di bawah ini

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

kita dapat menjangkau cabang dari perusahaan dan bank dari cabang seperti ini: company.BankBranch.Bank.

Bahkan jika kita memiliki desain yang terstruktur dengan baik, EF dapat memberikan kesalahan ini. Saya hanya menggunakan atribut ProxyCreationEnable untuk mengambil Json data dari pengontrol.

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

Anda mungkin mematikan proxy untuk menghindari referensi melingkar.

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