Sobes.tech
Middle

Como implementar uma relação de 'um para muitos' numa base de dados ou no código C#?

sobes.tech IA

Resposta da IA

Na base de dados:

  • Cria-se uma tabela para "um" (o pai) e uma tabela para "muitos" (os filhos).
  • É adicionada uma chave estrangeira na tabela "muitos" que referencia a chave primária da tabela "um".
  • Exemplo: Tabelas Companies e Employees. Na tabela Employees, há uma coluna CompanyId (chave estrangeira) que referencia Id (chave primária) na tabela Companies.

Em código C#:

Com Entity Framework Core:

  • São definidas classes de modelos para o pai e os filhos.
  • A classe do pai inclui uma coleção de objetos filhos.
  • A classe do filho inclui uma referência ao objeto pai e a chave estrangeira.
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Employee> Employees { get; set; } // Propriedade de navegação para "muitos"
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyId { get; set; } // Chave estrangeira
        public Company Company { get; set; } // Propriedade de navegação para "um"
    }
    
  • No contexto da base de dados, as relações são configuradas (às vezes o Entity Framework Core pode detectá-las por convenção).
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }
        public DbSet<Employee> Employees { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Especificação explícita da relação (não sempre necessária)
            modelBuilder.Entity<Company>()
                .HasMany(c => c.Employees) // A empresa tem muitos funcionários
                .WithOne(e => e.Company) // O funcionário tem uma única empresa
                .HasForeignKey(e => e.CompanyId); // Chave estrangeira na tabela Employee
        }
    }
    

Sem ORM (manual):

  • Obtenção de dados da base de dados usando consultas JOIN.
    // Exemplo de consulta SQL
    // SELECT c.Name AS CompanyName, e.Name AS EmployeeName
    // FROM Companies c
    // JOIN Employees e ON c.Id = e.CompanyId;
    
  • Criação de classes correspondentes e ligação manual de objetos após obter os dados.
    public class Company
    {
        public string Name { get; set; }
        public List<Employee> Employees { get; set; } // Coleção para armazenar objetos relacionados
    }
    
    public class Employee
    {
        public string Name { get; set; }
    }
    
    // Exemplo de criação de objetos após obter os dados
    // 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" });