Sobes.tech
Middle

C# da ko‘pdan-ko‘pga bog‘lanishni qanday amalga oshirish mumkin?

sobes.tech AI

AIdan javob

C# da Entity Framework Core yordamida "ko'pdan ko'p" munosabatlar odatda oraliq (birlashtiruvchi) jadval orqali amalga oshiriladi.

Amalga oshirish bosqichlari:

  1. Varliklarni yaratish: Ikkala tomon uchun ikkita varlik sinfini aniqlang.
  2. Oraliq varlikni yaratish: Alohida oraliq jadval uchun varlik sinfini yarating. Bu varlik ikkala bog'langan varlikka tashqi kalitlarni o'z ichiga oladi va, ehtimol, munosabatni tavsiflovchi qo'shimcha xususiyatlarni ham.
  3. DbContextda munosabatlarni sozlash: OnModelCreating metodida, DbContextingizda oraliq varlik va ikkita asosiy varlik o'rtasidagi munosabatlarni sozlang. Aniq sozlash uchun HasMany, WithMany, UsingEntity metodlaridan foydalaning.

Misol:

Aytaylik, sizda Book va Author entiteleri bor va bir kitob bir nechta mualliflar tomonidan yozilgan bo'lishi mumkin, va bir muallif bir nechta kitob yozishi mumkin.

// Entitet 1
public class Book
{
    public int Id { get; set; }
    public string Title { get; set; }
    public ICollection<BookAuthor> BookAuthors { get; set; }
}

// Entitet 2
public class Author
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<BookAuthor> BookAuthors { get; set; }
}

// Oraliq entitet
public class BookAuthor
{
    public int BookId { get; set; }
    public Book Book { get; set; }

    public int AuthorId { get; set; }
    public Author Author { get; set; }

    // Qo'shimcha xususiyatlar, masalan, muallifning kitobdagi roli
    public string Role { get; set; }
}
// DbContextda sozlash
public class ApplicationDbContext : DbContext
{
    public DbSet<Book> Books { get; set; }
    public DbSet<Author> Authors { get; set; }
    public DbSet<BookAuthor> BookAuthors { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<BookAuthor>()
            .HasKey(ba => new { ba.BookId, ba.AuthorId }); // Birikma kalit

        modelBuilder.Entity<BookAuthor>()
            .HasOne(ba => ba.Book)
            .WithMany(b => b.BookAuthors)
            .HasForeignKey(ba => ba.BookId);

        modelBuilder.Entity<BookAuthor>()
            .HasOne(ba => ba.Author)
            .WithMany(a => a.BookAuthors)
            .HasForeignKey(ba => ba.AuthorId);
    }
}

Foydalanish:

// Kitob va muallif qo'shish
var book = new Book { Title = "Mening Ajoyib Kitobim" };
var author = new Author { Name = "Jane Doe" };

var bookAuthor = new BookAuthor {
    Book = book,
    Author = author,
    Role = "Asosiy Muallif"
};

_context.Books.Add(book);
_context.Authors.Add(author);
_context.BookAuthors.Add(bookAuthor);

_context.SaveChanges();

// Kitob va mualliflarni olish
var bookWithAuthors = _context.Books
    .Include(b => b.BookAuthors)
    .ThenInclude(ba => ba.Author)
    .FirstOrDefault(b => b.Id == book.Id);

// Muallif va kitoblarni olish
var authorWithBooks = _context.Authors
    .Include(a => a.BookAuthors)
    .ThenInclude(ba => ba.Book)
    .FirstOrDefault(a => a.Id == author.Id);

Ushbu yondashuv oraliq entitet bilan munosabatlar haqida qo'shimcha ma'lumotlarni boshqarishga moslashuvchanlikni ta'minlaydi va EF Coreda tavsiya etiladi. Oddiy holatlarda, EF Core avtomatik ravishda yashirin oraliq jadvalni yaratishi mumkin, lekin aniq belgilangan entitet katta nazorat imkonini beradi.