Middle
¿Cómo implementar una relación de 'uno a muchos' en una base de datos o en código C#?
sobes.tech AI
Respuesta de la IA
En la base de datos:
- Se crea una tabla para "uno" (el padre) y una tabla para "muchos" (los hijos).
- Se añade una clave externa en la tabla "muchos" que hace referencia a la clave primaria de la tabla "uno".
- Ejemplo: Tablas
CompaniesyEmployees. En la tablaEmployeeshay una columnaCompanyId(clave externa) que hace referencia aId(clave primaria) en la tablaCompanies.
En código C#:
Con Entity Framework Core:
- Se definen clases de modelos para el padre y los hijos.
- La clase del padre incluye una colección de objetos hijos.
- La clase del hijo incluye una referencia al objeto padre y la clave externa.
public class Company { public int Id { get; set; } public string Name { get; set; } public ICollection<Employee> Employees { get; set; } // Propiedad de navegación para "muchos" } public class Employee { public int Id { get; set; } public string Name { get; set; } public int CompanyId { get; set; } // Clave externa public Company Company { get; set; } // Propiedad de navegación para "uno" } - En el contexto de la base de datos, se configuran las relaciones (a veces Entity Framework Core puede detectarlas por convención).
public class ApplicationDbContext : DbContext { public DbSet<Company> Companies { get; set; } public DbSet<Employee> Employees { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // Especificación explícita de la relación (no siempre necesaria) modelBuilder.Entity<Company>() .HasMany(c => c.Employees) // La compañía tiene muchos empleados .WithOne(e => e.Company) // El empleado tiene una sola compañía .HasForeignKey(e => e.CompanyId); // Clave externa en la tabla Employee } }
Sin ORM (manual):
- Obtención de datos desde la base de datos usando consultas JOIN.
// Ejemplo de consulta SQL // SELECT c.Name AS CompanyName, e.Name AS EmployeeName // FROM Companies c // JOIN Employees e ON c.Id = e.CompanyId; - Creación de clases correspondientes y vinculación manual de objetos tras obtener los datos.
public class Company { public string Name { get; set; } public List<Employee> Employees { get; set; } // Colección para almacenar objetos relacionados } public class Employee { public string Name { get; set; } } // Ejemplo de creación de objetos tras obtener los datos // 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" });