Sobes.tech
Middle

Come implementare una relazione 'uno a molti' in un database o nel codice C#?

sobes.tech AI

Risposta dell'AI

Nel database:

  • Viene creata una tabella per "uno" (il genitore) e una tabella per "molti" (i figli).
  • Viene aggiunta una chiave esterna nella tabella "molti" che fa riferimento alla chiave primaria della tabella "uno".
  • Esempio: Tabelle Companies e Employees. Nella tabella Employees, c'è una colonna CompanyId (chiave esterna) che fa riferimento a Id (chiave primaria) nella tabella Companies.

Nel codice C#:

Con Entity Framework Core:

  • Si definiscono classi modello per il genitore e i figli.
  • La classe del genitore include una collezione di oggetti figli.
  • La classe del figlio include un riferimento all'oggetto genitore e la chiave esterna.
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Employee> Employees { get; set; } // Proprietà di navigazione per "molti"
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyId { get; set; } // Chiave esterna
        public Company Company { get; set; } // Proprietà di navigazione per "uno"
    }
    
  • Nel contesto del database, vengono configurate le relazioni (a volte Entity Framework Core può rilevarle per convenzione).
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }
        public DbSet<Employee> Employees { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Specifica esplicita della relazione (non sempre necessaria)
            modelBuilder.Entity<Company>()
                .HasMany(c => c.Employees) // La compagnia ha molti dipendenti
                .WithOne(e => e.Company) // Il dipendente ha una sola compagnia
                .HasForeignKey(e => e.CompanyId); // Chiave esterna nella tabella Employee
        }
    }
    

Senza ORM (manuale):

  • Recupero dei dati dal database usando query JOIN.
    // Esempio di query SQL
    // SELECT c.Name AS CompanyName, e.Name AS EmployeeName
    // FROM Companies c
    // JOIN Employees e ON c.Id = e.CompanyId;
    
  • Creazione delle classi corrispondenti e collegamento manuale degli oggetti dopo aver ottenuto i dati.
    public class Company
    {
        public string Name { get; set; }
        public List<Employee> Employees { get; set; } // Collezione per memorizzare gli oggetti correlati
    }
    
    public class Employee
    {
        public string Name { get; set; }
    }
    
    // Esempio di creazione di oggetti dopo aver ottenuto i dati
    // 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" });