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
CompanieseEmployees. Nella tabellaEmployees, c'è una colonnaCompanyId(chiave esterna) che fa riferimento aId(chiave primaria) nella tabellaCompanies.
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" });