Sobes.tech
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 Companies y Employees. En la tabla Employees hay una columna CompanyId (clave externa) que hace referencia a Id (clave primaria) en la tabla Companies.

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" });