|
Dasturiy injiniring (EntityFramework 6)
|
bet | 43/53 | Sana | 30.11.2023 | Hajmi | 1,39 Mb. | | #108476 |
Bog'liq Dasturiy injiniringWithRequiredPrincipal() 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 ICollection Companies { get; set; }
public Phone()
{
Companies = new List();
}
}
public class Company
{
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:
modelBuilder.Entity()
.HasMany(p => p.Companies)
.WithMany(c => c.Phones)
.Map(m =>
{
m.ToTable("MobileCompanies");
m.MapLeftKey("PhoneId");
m.MapRightKey("CompanyId");
});
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);
}
}
|
| |