Sobes.tech
Middle

Comment implémenter une relation 'un à plusieurs' dans une base de données ou dans du code C#?

sobes.tech IA

Réponse de l'IA

Dans la base de données:

  • Une table est créée pour "un" (le parent) et une autre pour "plusieurs" (les enfants).
  • Une clé étrangère est ajoutée dans la table "plusieurs" qui référence la clé primaire de la table "un".
  • Exemple : Tables Companies et Employees. Dans la table Employees, il y a une colonne CompanyId (clé étrangère) qui référence Id (clé primaire) dans la table Companies.

En code C# :

Avec Entity Framework Core :

  • Des classes de modèles pour le parent et les enfants sont définies.
  • La classe du parent inclut une collection d'objets enfants.
  • La classe de l'enfant inclut une référence à l'objet parent et la clé étrangère.
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Employee> Employees { get; set; } // Propriété de navigation pour "plusieurs"
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyId { get; set; } // Clé étrangère
        public Company Company { get; set; } // Propriété de navigation pour "un"
    }
    
  • Dans le contexte de la base de données, les relations sont configurées (parfois Entity Framework Core peut les détecter par convention).
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }
        public DbSet<Employee> Employees { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Définition explicite de la relation (pas toujours nécessaire)
            modelBuilder.Entity<Company>()
                .HasMany(c => c.Employees) // La société a beaucoup d'employés
                .WithOne(e => e.Company) // L'employé a une seule société
                .HasForeignKey(e => e.CompanyId); // Clé étrangère dans la table Employee
        }
    }
    

Sans ORM (manuel) :

  • Récupération des données depuis la base de données en utilisant des requêtes JOIN.
    // Exemple de requête SQL
    // SELECT c.Name AS CompanyName, e.Name AS EmployeeName
    // FROM Companies c
    // JOIN Employees e ON c.Id = e.CompanyId;
    
  • Création des classes correspondantes et liaison manuelle des objets après récupération des données.
    public class Company
    {
        public string Name { get; set; }
        public List<Employee> Employees { get; set; } // Collection pour stocker les objets liés
    }
    
    public class Employee
    {
        public string Name { get; set; }
    }
    
    // Exemple de création d'objets après récupération des données
    // 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" });