Sobes.tech
Middle

Cum se implementează o relație 'unu la mai mulți' într-o bază de date sau în codul C#?

sobes.tech AI

Răspuns de la AI

În baza de date:

  • Se creează un tabel pentru "unu" (părintele) și un tabel pentru "mulți" (copii).
  • Se adaugă o cheie externă în tabelul "mulți" care face referire la cheia primară a tabelului "unu".
  • Exemplu: Tabelele Companies și Employees. În tabelul Employees, există o coloană CompanyId (cheie externă) care face referire la Id (cheie primară) în tabelul Companies.

În cod C#:

Cu Entity Framework Core:

  • Se definesc clasele modele pentru părinți și copii.
  • Clasa părinte include o colecție de obiecte copii.
  • Clasa copil include o referință la obiectul părinte și cheia externă.
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Employee> Employees { get; set; } // Proprietate de navigare pentru "mulți"
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyId { get; set; } // Cheie externă
        public Company Company { get; set; } // Proprietate de navigare pentru "unu"
    }
    
  • În contextul bazei de date, se configurează relațiile (uneori Entity Framework Core le poate detecta după convenție).
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }
        public DbSet<Employee> Employees { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Specificare explicită a relației (nu întotdeauna necesară)
            modelBuilder.Entity<Company>()
                .HasMany(c => c.Employees) // Compania are mulți angajați
                .WithOne(e => e.Company) // Angajatul are o singură companie
                .HasForeignKey(e => e.CompanyId); // Cheie externă în tabelul Employee
        }
    }
    

Fără ORM (manual):

  • Se obține datele din baza de date folosind interogări JOIN.
    // Exemplu de interogare SQL
    // SELECT c.Name AS CompanyName, e.Name AS EmployeeName
    // FROM Companies c
    // JOIN Employees e ON c.Id = e.CompanyId;
    
  • Se creează clasele corespunzătoare și se leagă manual obiectele după obținerea datelor.
    public class Company
    {
        public string Name { get; set; }
        public List<Employee> Employees { get; set; } // Colecție pentru stocarea obiectelor legate
    }
    
    public class Employee
    {
        public string Name { get; set; }
    }
    
    // Exemplu de creare a obiectelor după obținerea datelor
    // 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" });