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
CompanieseEmployees. Na tabelaEmployees, há uma colunaCompanyId(chave estrangeira) que referenciaId(chave primária) na tabelaCompanies.
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" });