Saya baru saja mulai menggunakan kode EF terlebih dahulu, jadi saya adalah pemula total dalam topik ini.
Saya ingin membuat hubungan antara Tim dan Pertandingan:
1 pertandingan = 2 tim (rumah, tamu) dan hasil.
Saya pikir mudah untuk membuat model seperti itu, jadi saya mulai mengkodekan:
public class Team
{
[Key]
public int TeamId { get; set;}
public string Name { get; set; }
public virtual ICollection<Match> Matches { get; set; }
}
public class Match
{
[Key]
public int MatchId { get; set; }
[ForeignKey("HomeTeam"), Column(Order = 0)]
public int HomeTeamId { get; set; }
[ForeignKey("GuestTeam"), Column(Order = 1)]
public int GuestTeamId { get; set; }
public float HomePoints { get; set; }
public float GuestPoints { get; set; }
public DateTime Date { get; set; }
public virtual Team HomeTeam { get; set; }
public virtual Team GuestTeam { get; set; }
}
Dan saya mendapatkan pengecualian:
Hubungan referensial akan menghasilkan referensi siklus yang tidak diizinkan. [Kendala nama = Match_GuestTeam]
Bagaimana saya bisa membuat model seperti itu, dengan 2 kunci asing ke tabel yang sama?
Dimungkinkan juga untuk menentukan
ForeignKey()
atribut pada properti navigasi:Dengan begitu Anda tidak perlu menambahkan kode apa pun ke
OnModelCreate
metode inisumber
OnModelCreate
sesuai jawaban yang diterima serta dua koleksi untuk kedua sisi hubungan.Saya tahu ini adalah postingan lama beberapa tahun dan Anda dapat memecahkan masalah Anda dengan solusi di atas. Namun, saya hanya ingin menyarankan menggunakan InverseProperty untuk seseorang yang masih membutuhkan. Setidaknya Anda tidak perlu mengubah apa pun di OnModelCreating.
Kode di bawah ini tidak diuji.
Anda dapat membaca lebih lanjut tentang InverseProperty di MSDN: https://msdn.microsoft.com/en-us/data/jj591583?f=255&MSPPError=-2147217396#Relationships
sumber
Anda juga dapat mencoba ini:
Saat Anda membuat kolom FK mengizinkan NULLS, Anda memutus siklus. Atau kita hanya menipu generator skema EF.
Dalam kasus saya, modifikasi sederhana ini menyelesaikan masalah.
sumber
Ini karena Penghapusan Cascade diaktifkan secara default. Masalahnya adalah ketika Anda memanggil delete pada entitas, itu akan menghapus masing-masing entitas yang direferensikan f-key juga. Anda seharusnya tidak membuat nilai-nilai 'wajib' dapat dibatalkan untuk memperbaiki masalah ini. Opsi yang lebih baik adalah menghapus konvensi penghapusan Cascade EF Code First:
Mungkin lebih aman untuk secara eksplisit menunjukkan kapan melakukan penghapusan kaskade untuk masing-masing anak saat pemetaan / konfigurasi. entitas.
sumber
Restrict
bukanCascade
?InverseProperty
di EF Core menjadikan solusi mudah dan bersih.Properti Balik
Jadi solusi yang diinginkan adalah:
sumber