WithRequiredPrincipal() metodi orqali majburiy aloqa va bitta ob’ekt asosiy sifatida o‘rnatiladi. Ushbu holda asosiy ob’ekt sifatida Phone modeli Phone: WithRequiredPrincipal(c => c.BestSeller) kabi ko‘rsatilgan.
Company modeli namoyish qilinadigan jadval esa Phones jadvaliga ikkilamchi kalitdan iborat bo‘ladi.
Ko‘pga-ko‘p aloqa (many-to-many) Yuqoridagi modelga o‘zgartirish kiritamiz. Bizdagi har ikkala model boshqa modellar ro‘yxatini o‘zida saqlasin. Masalan, kompaniyada bir qancha turdagi telefonlar ishlab chiqarilishi va bitta telefon bir nechta kompaniyalar hamkorligida ishlab chiqilsin:
public class Phone
{
public int Id { get; set; }
public string Name { get; set; }
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection Phones { get; set; }
public Company()
{
Phones = new List();
}
}
Ushbu modelga mos aloqa quyidagicha shakllantiriladi:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(p => p.Companies)
.WithMany(c => c.Phones);
base.OnModelCreating(modelBuilder);
}
HasMany()metodi orqali Phone va Company ob’ektlari o‘rtasida ko‘pga-ko‘p aloqa o‘rnatiladi. WithMany()metodi esa Phone va Company ob’ektlari o‘rtasida teskari ko‘pga-ko‘p aloqa o‘rnatiladi.
Yuqoridagi turdagi aloqaga mos ma’lumotlar bazasida uchinchi bog‘lovchi jadval shakllantiriladi:
Ammo bizni ushbu turdagi bog‘lovchi jadval va ustunlari nomi qanoatlantirmaydi. Shuning uchun quyidagicha moslashtirishlarni amalga oshiramiz:
Yuqorida keltirilgan modelaga mos quyidagi so‘rovni amalga oshirishimiz mumkin:
using (FluentContext db = new FluentContext())
{
var items = from i in db.Phones
join fi in db.Companies on i.Id equals fi.Id
where fi.Id == 1
select i;
foreach (var item in items)
{
Console.WriteLine(item.Name);
}
}