Sobes.tech
Middle

Verilənlər bazasında və ya C# kodunda 'birə çox' əlaqəsini necə həyata keçirmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

Veritabanında:

  • "bir" (valideyn) və "bir çox" (uşaqlar) üçün cədvəllər yaradılır.
  • "Çox" cədvəlinə, "bir" cədvəlinin birincil açarına istinad edən xarici açar əlavə olunur.
  • Nümunə: CompaniesEmployees cədvəlləri. Employees cədvəlində, CompanyId (xarici açar) sütunu, Companies cədvəlindəki Id (birincil açar) sütununa istinad edir.

C# kodunda:

Entity Framework Core ilə:

  • Valideyn və uşaqlar üçün model sinfləri təyin edilir.
  • Valideyn sinfi, uşaq obyektlərinin kolleksiyasını ehtiva edir.
  • Uşaq sinfi, valideyn obyektinə istinad və xarici açar ehtiva edir.
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Employee> Employees { get; set; } // "Çox" üçün naviqasiya xüsusiyyəti
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyId { get; set; } // Xarici açar
        public Company Company { get; set; } // "Bir" üçün naviqasiya xüsusiyyəti
    }
    
  • Verilənlər bazası kontekstində əlaqələr konfiqurasiya edilir (bəzən Entity Framework Core onları konvensiya əsasında aşkar edə bilər).
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }
        public DbSet<Employee> Employees { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Aydın şəkildə əlaqənin göstərilməsi (hər zaman lazım deyil)
            modelBuilder.Entity<Company>()
                .HasMany(c => c.Employees) // Şirkət çox işçiyə malikdir
                .WithOne(e => e.Company) // İşçinin bir şirkəti var
                .HasForeignKey(e => e.CompanyId); // Employee cədvəlində xarici açar
        }
    }
    

ORM olmadan (əl ilə):

  • JOIN sorğuları istifadə edilərək məlumatlar bazasından alınır.
    // SQL sorğusu nümunəsi
    // SELECT c.Name AS CompanyName, e.Name AS EmployeeName
    // FROM Companies c
    // JOIN Employees e ON c.Id = e.CompanyId;
    
  • Uyğun sinflər yaradılır və məlumatlar alındıqdan sonra obyektlər əl ilə əlaqələndirilir.
    public class Company
    {
        public string Name { get; set; }
        public List<Employee> Employees { get; set; } // Əlaqəli obyektləri saxlamaq üçün kolleksiya
    }
    
    public class Employee
    {
        public string Name { get; set; }
    }
    
    // Məlumatlar alındıqdan sonra obyektlərin yaradılması nümunəsi
    // Company company = new Company { Name = "ACME Corp", Employees = new List<Employee>() };
    // company.Employees.Add(new Employee { Name = "Alice" });
    // company.Employees.Add(new Employee { Name = "Bob" });