Saya telah bereksperimen dengan membuat situs web yang memanfaatkan MVC dengan JSON untuk lapisan presentasi saya dan kerangka kerja Entity untuk model data / database. Masalah saya mulai berperan dengan membuat serialisasi objek Model saya ke dalam JSON.
Saya menggunakan metode kode pertama untuk membuat database saya. Ketika melakukan kode metode pertama hubungan satu ke banyak (orang tua / anak) mengharuskan anak untuk memiliki referensi kembali ke orang tua. (Contoh kode saya menjadi salah ketik tetapi Anda mendapatkan gambar)
class parent
{
public List<child> Children{get;set;}
public int Id{get;set;}
}
class child
{
public int ParentId{get;set;}
[ForeignKey("ParentId")]
public parent MyParent{get;set;}
public string name{get;set;}
}
Ketika mengembalikan objek "induk" melalui JsonResult, kesalahan referensi melingkar dilemparkan karena "child" memiliki properti induk kelas.
Saya telah mencoba atribut ScriptIgnore tetapi saya kehilangan kemampuan untuk melihat objek anak. Saya perlu menampilkan informasi dalam tampilan anak induk di beberapa titik.
Saya telah mencoba membuat kelas dasar untuk orang tua dan anak yang tidak memiliki referensi melingkar. Sayangnya ketika saya mencoba mengirim baseParent dan baseChild, ini dibaca oleh JSON Parser sebagai kelas turunannya (saya cukup yakin konsep ini lolos dari saya).
Base.baseParent basep = (Base.baseParent)parent;
return Json(basep, JsonRequestBehavior.AllowGet);
Satu solusi yang saya buat adalah membuat Model "View". Saya membuat versi sederhana dari model database yang tidak menyertakan referensi ke kelas induk. Model tampilan ini masing-masing memiliki metode untuk mengembalikan Versi Database dan konstruktor yang menggunakan model database sebagai parameter (viewmodel.name = databasemodel.name). Metode ini tampaknya dipaksakan meskipun berhasil.
CATATAN: Saya memposting di sini karena saya pikir ini diskusi yang lebih layak. Saya bisa memanfaatkan pola desain yang berbeda untuk mengatasi masalah ini atau itu bisa sesederhana menggunakan atribut yang berbeda pada model saya. Dalam pencarian saya, saya belum melihat metode yang baik untuk mengatasi masalah ini.
Tujuan akhir saya adalah memiliki aplikasi MVC yang bagus yang memanfaatkan JSON untuk berkomunikasi dengan server dan menampilkan data. Sambil mempertahankan model yang konsisten di seluruh lapisan (atau yang terbaik yang bisa saya buat dengan).
sumber
Alternatif yang lebih sederhana untuk mencoba membuat serialisasi objek adalah dengan menonaktifkan serialisasi objek induk / anak. Sebagai gantinya, Anda dapat membuat panggilan terpisah untuk mengambil objek induk / anak terkait saat dan saat Anda membutuhkannya. Ini mungkin tidak ideal untuk aplikasi Anda, tetapi ini pilihan.
Untuk melakukan ini, Anda bisa mengatur DataContractSerializer dan mengatur properti DataContractSerializer.PreserveObjectReferences menjadi 'false' di konstruktor kelas model data Anda. Ini menentukan bahwa referensi objek tidak boleh dipertahankan pada serialisasi tanggapan HTTP.
Contoh:
Format json:
Format XML:
Ini berarti bahwa jika Anda mengambil item yang memiliki objek anak dirujuk, objek anak tidak akan diserialisasi.
Lihat juga kelas DataContractsSerializer .
sumber
Serializer JSON yang berkaitan dengan Referensi Lingkaran
Berikut adalah contoh kebiasaan Jackson
JSONSerializer
yang menangani referensi melingkar dengan membuat serial kejadian pertama dan menyimpan *reference
ke kejadian pertama pada semua kejadian berikutnya.Berurusan dengan Referensi Lingkaran ketika Menerialisasi objek dengan Jackson
Cuplikan parsial yang relevan dari artikel di atas:
sumber
Mengirimkan minimal data adalah satu-satunya jawaban yang benar. Ketika Anda mengirim data dari database, biasanya tidak masuk akal untuk mengirimkan setiap kolom dengan semua asosiasi. Konsumen tidak perlu berurusan dengan asosiasi dan struktur basis data, yaitu untuk basis data. Ini tidak hanya akan menghemat bandwidth tetapi juga lebih mudah untuk mempertahankan, membaca, dan mengkonsumsi. Permintaan data dan kemudian modelkan untuk apa yang sebenarnya Anda butuhkan untuk mengirim. minimum.
sumber
.Include(x => x.TableName )
tidak mengembalikan hubungan (dari tabel utama ke tabel dependen), atau hanya mengembalikan satu baris data, FIX HERE:/programming/43127957/include-not-working-in-net-core-returns-one-parent
Juga, di Startup.cs pastikan Anda memilikinya di atas:
sumber