Sobes.tech
Middle

Ako implementovať vzťah 'jeden ku mnohým' v databáze alebo v kóde C#?

sobes.tech AI

Odpoveď od AI

V databáze:

  • Vytvára sa tabuľka pre "jedného" (rodiča) a tabuľka pre "mnohé" (deti).
  • Do tabuľky "mnohých" sa pridá cudzí kľúč odkazujúci na primárny kľúč tabuľky "jedného".
  • Príklad: Tabuľky Companies a Employees. V tabuľke Employees je stĺpec CompanyId (cudzí kľúč), ktorý odkazuje na Id (primárny kľúč) v tabuľke Companies.

V kóde v C#:

S použitím Entity Framework Core:

  • Definujú sa modelové triedy pre rodiča a deti.
  • Trieda rodiča obsahuje kolekciu dcérskych objektov.
  • Trieda dieťaťa obsahuje odkaz na rodičovský objekt a cudzí kľúč.
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Employee> Employees { get; set; } // Navigačná vlastnosť pre "mnohé"
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyId { get; set; } // Cudzí kľúč
        public Company Company { get; set; } // Navigačná vlastnosť pre "jedno"
    }
    
  • V kontexte databázy sa nastavujú vzťahy (niekedy Entity Framework Core ich môže určiť podľa konvencie).
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }
        public DbSet<Employee> Employees { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Explicitné určenie vzťahu (nie vždy je to potrebné)
            modelBuilder.Entity<Company>()
                .HasMany(c => c.Employees) // Spoločnosť má veľa zamestnancov
                .WithOne(e => e.Company) // Zamestnanec má jednu spoločnosť
                .HasForeignKey(e => e.CompanyId); // Cudzí kľúč v tabuľke Employee
        }
    }
    

Bez ORM (ručne):

  • Získanie dát z DB pomocou JOIN dotazov.
    // Príklad SQL dotazu
    // SELECT c.Name AS CompanyName, e.Name AS EmployeeName
    // FROM Companies c
    // JOIN Employees e ON c.Id = e.CompanyId;
    
  • Vytvorenie zodpovedajúcich tried a ručné prepojenie objektov po získaní dát.
    public class Company
    {
        public string Name { get; set; }
        public List<Employee> Employees { get; set; } // Kolekcia na uloženie prepojených objektov
    }
    
    public class Employee
    {
        public string Name { get; set; }
    }
    
    // Príklad vytvorenia objektov po získaní dát
    // 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" });