Saya telah mencari stackoverflow untuk solusi yang tepat dalam menghasilkan hubungan banyak ke banyak , menggunakan EF Core, Code first dan Fluent API.
Skenario sederhana adalah:
public class Person
{
public Person() {
Clubs = new HashSet<Club>();
}
public int PersonId { get; set; }
public virtual ICollection<Club> Clubs { get; set; }
}
public class Club
{
public Club() {
Persons = new HashSet<Person>();
}
public int ClubId { get; set; }
public virtual ICollection<Person> Persons { get; set; }
}
Harap perbaiki saya jika saya salah, tetapi sejujurnya saya tidak dapat menemukan pertanyaan yang berisi penjelasan terperinci tentang cara melakukan ini menggunakan alat yang dijelaskan. Adakah yang bisa menjelaskan bagaimana ini dilakukan?
EF Core 5.0 RC1 +
Pada EF Core 5.0 RC1, hal ini dapat dilakukan tanpa tabel gabungan eksplisit. EF Core dapat mengonfigurasi pemetaan untuk hubungan banyak-ke-banyak yang ditampilkan dalam pertanyaan Anda tanpa mengharuskan Anda membuat PersonClubtipe.
Lihat Yang Baru di EF Core 5.0, RC1, Many-to-many di dokumen resmi untuk informasi lebih lanjut.
Versi sebelumnya
Ini belum dapat dilakukan di EF Core tanpa menggunakan kelas eksplisit untuk bergabung. Lihat di sini untuk contoh bagaimana melakukan itu.
Ada masalah terbuka di Github yang meminta kemampuan untuk melakukan ini tanpa memerlukan kelas eksplisit, tetapi ini belum diselesaikan.
Menggunakan skenario Anda, contoh yang saya tautkan akan merekomendasikan kelas entitas berikut:
public class Person
{
public int PersonId { get; set; }
public virtual ICollection<PersonClub> PersonClubs { get; set; }
}
public class Club
{
public int ClubId { get; set; }
public virtual ICollection<PersonClub> PersonClubs { get; set; }
}
public class PersonClub
{
public int PersonId { get; set; }
public Person Person { get; set; }
public int ClubId { get; set; }
public Club Club { get; set; }
}
Berikut ini OnModelCreatingakan digunakan untuk penyiapan:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<PersonClub>()
.HasKey(pc => new { pc.PersonId, pc.ClubId });
modelBuilder.Entity<PersonClub>()
.HasOne(pc => pc.Person)
.WithMany(p => p.PersonClubs)
.HasForeignKey(pc => pc.PersonId);
modelBuilder.Entity<PersonClub>()
.HasOne(pc => pc.Club)
.WithMany(c => c.PersonClubs)
.HasForeignKey(pc => pc.ClubId);
}
Pastikan untuk membuka masalah terbuka yang saya tautkan dan menyuarakan rasa frustrasi Anda jika Anda merasa perlu.
EDIT: Masalah terbuka menyarankan penggunaan yang sederhana Selectuntuk menavigasi melalui hierarki yang agak rumit ini. Untuk berpindah dari satu PersonIdke koleksi Club, Anda bisa menggunakan SelectMany. misalnya:
var clubs = dbContext.People
.Where(p => p.PersonId == id)
.SelectMany(p => p.PersonClubs);
.Select(pc => pc.Club);
Saya tidak dapat menjamin apakah ini benar-benar sebuah "praktik terbaik", tetapi itu pasti berhasil dan saya pikir adil untuk mengatakan itu tidak terlalu jelek.
"Penyiapan" yang benar untuk ini adalah:
public class Person
{
public int PersonId { get; set; }
public virtual ICollection<PersonClub> PersonClubs { get; set; }
}
public class Club
{
public int ClubId { get; set; }
public virtual ICollection<PersonClub> PersonClubs { get; set; }
}
public class PersonClub
{
public int PersonId { get; set; }
public Person Person { get; set; }
public int ClubId { get; set; }
public Club Club { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<PersonClub>()
.HasKey(pc => new { pc.PersonId, pc.ClubId });
}
Jadi, blok untuk mengkonfigurasi "glue-table" ini tidak diperlukan seperti pada contoh @Kirk:
modelBuilder.Entity<PersonClub>()
.HasOne(pc => pc.Person)
.WithMany(p => p.PersonClubs)
.HasForeignKey(pc => pc.PersonId);
modelBuilder.Entity<PersonClub>()
.HasOne(pc => pc.Club)
.WithMany(c => c.PersonClubs)
.HasForeignKey(pc => pc.ClubId);
Jadi setiap Personmemiliki nol atau lebih Clubsdan setiap Clubmemiliki nol atau lebih Persons. Seperti yang Anda nyatakan dengan benar, ini adalah relasi banyak-ke-banyak yang tepat.
Anda mungkin tahu bahwa database relasional memerlukan tabel tambahan untuk mengimplementasikan hubungan banyak-ke-banyak ini. Hal yang menyenangkan tentang kerangka entitas, adalah ia mengenali hubungan ini dan membuat tabel tambahan ini untuk Anda.
Pada pandangan pertama tampaknya masalah bahwa tabel tambahan ini tidak ada dbSetdi Anda DbContext: "Bagaimana cara melakukan penggabungan dengan tabel tambahan ini jika saya tidak memilikinya DbSet?".
Untungnya, Anda tidak perlu menyebutkan tabel tambahan ini dalam kueri Anda.
Jika Anda membutuhkan pertanyaan seperti "Beri saya semua 'Klub' yang ... dari setiap 'Orang' yang ..." jangan berpikir untuk bergabung. Sebagai gantinya gunakan ICollections!
Ajak semua orang "John Doe" dengan semua Country club yang mereka hadiri:
var result = myDbContext.Persons
.Where(person => person.Name == "John Doe")
.Select(person => new
{
PersonId = person.Id,
PersonName = person.Name,
AttendedCountryClubs = person.Clubs
.Where(club => club.Type = ClubType.CountryClub),
};
Kerangka kerja entitas akan mengenali bahwa gabungan dengan tabel banyak-ke-banyak ekstra diperlukan, dan akan melakukan penggabungan ini, tanpa Anda menyebutkan tabel tambahan ini.
Sebaliknya: Ajak semua country club dengan Person "John Doe" mereka:
var result = myDbContext.Clubs
.Where(club => club.Type = ClubType.CountryClub)
.Select(club => new
{
ClubId = club.Id,
ClubName = club.Name,
AnonymousMembers = club.Persons
.Where(person => person.Name == "John Doe"),
}
Saya telah mengalami bahwa begitu saya mulai memikirkan koleksi yang dihasilkan yang saya inginkan alih-alih gabungan yang saya butuhkan untuk mendapatkan koleksi ini, saya menemukan bahwa saya hampir tidak menggunakan gabungan. Ini adalah kasus relasi one-to-many serta many-to-many. Framework entitas secara internal akan menggunakan gabungan yang tepat.
Jana Duggar terbuka tentang pencarian cintanya. Inilah semua yang dia katakan tentang topik dan jendela lima tahun untuk menikah.
Bintang 'Outlander' Sam Heughan baru-baru ini mengungkapkan apa yang akan dia ambil dari lokasi syuting untuk mengingat Jamie Fraser, peran yang membuatnya menjadi bintang.
'She Loves You' ditulis dalam satu jam, direkam dalam sehari, dan merupakan lagu The Beatles dengan salah satu penampilan terbaik dalam karir mereka.
Dolly Parton dan Nenek Bessie memiliki hubungan khusus. Nenek Parton sakit parah, tapi itu tidak menghentikan Dolly untuk mengerjainya.
Anda mungkin mengira kayu ek atau hickory kuat, tetapi jika berbicara tentang kayu terkeras di dunia, keduanya tidak ada yang mendekati.
Lautan memang penuh keindahan, tetapi juga menyembunyikan beberapa makhluk laut paling menakutkan di planet ini. Banyak dari hewan ini bersembunyi jauh di bawah permukaan laut, di dunia laut dalam yang gelap dan bertekanan tinggi.
Jika Anda sedang melawan monster musuh atau bersiap untuk skenario PvP, mengetahui pesona pedang terbaik di Minecraft dapat memberi Anda keuntungan besar. Memikat pedang memungkinkan Anda menghasilkan lebih banyak kerusakan, meningkatkan jumlah monster yang dijatuhkan, dan memperpanjang daya tahan pedang Anda.
Ketika orang berbicara tentang negara sosialis, mereka sering membayangkan kendali penuh pemerintah dan tanpa kepemilikan swasta. Namun dalam praktiknya, ekonomi sosialis sangat bervariasi.
“Children” merilis cameo dengan nama besar dan beberapa berita buruk
RAV4 ini diklaim dalam kondisi sangat baik dan siap digunakan untuk permainan kursi musik.
Rekaman drone memperlihatkan petugas pemadam kebakaran yang tampak kesulitan memadamkan api.
Eyes of Wakanda terhubung langsung dengan MCU, ditambah pembaruan tentang X-Men '97, What If..., Daredevil, dan banyak lagi.
'Laguna Beach' mengikuti kehidupan siswa sekolah menengah Lauren Conrad, Kristin Cavallari, Stephen Colletti, dan banyak lagi pada pertengahan tahun 2000-an. Berikut ini adalah tempat tinggal para pemeran serial realitas MTV tersebut sekarang.
Ava Gardner pernah menikah dengan Mickey Rooney dan Frank Sintra, dan ia pernah berpacaran dengan beberapa bintang Hollywood lainnya. Berikut ini kilas balik riwayat berpacaran Ava Gardner.
John Cleese menikahi istrinya, Jennifer Wade, pada tahun 2012. Berikut semua yang perlu Anda ketahui tentang istri John Cleese, Jennifer Wade.
Berikut semua yang perlu Anda ketahui tentang Francie Frane, mantan peternak yang menikah dengan Dog the Bounty Hunter.
Itu mengejutkan saya Tiba-tiba seperti yang sering terjadi Ini di tengah jalan lagi <Tidak, bukan yang di pasifik Anda merah marun, yang di karnaval> Setiap berita utama keras…..
Di tahun 2022, dengan dirilisnya GPT-3, kemampuan menulis sepertinya menjadi kurang penting. Dengan AI, orang dengan tulisan yang buruk juga dapat menghasilkan staf yang berkualitas.
Di dunia yang serba cepat dan kompetitif saat ini, karier seseorang memainkan peran penting dalam pertumbuhan pribadi, stabilitas keuangan, dan kepuasan hidup secara keseluruhan. Namun, banyak orang menemukan diri mereka terjebak dalam siklus stagnasi dan ketidakpuasan tanpa henti, secara bertahap menyia-nyiakan kehidupan profesional mereka.
Minggu lalu saya melihat siaran pers, dikirim melalui PressGazette (situs web berita media Inggris). Artikel tersebut mengumumkan bahwa Acast, perusahaan hosting dan periklanan podcast Scandi, akan memimpin konsorsium penerbit "mungkin yang paling berpengaruh" dalam podcasting.