Ejemplo combinado
Aquí tienes un conjunto de entidades para un contexto de ejemplo, que representa una escuela con las entidades Estudiante, Curso, y Inscripción. Esto incluye relaciones One-to-Many y Many-to-Many, así como código para insertar datos de prueba y realizar consultas complejas.
Paso 1: Entidades
Clases de entidades
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public class Estudiante
{
[Key]
public int EstudianteId { get; set; }
public string Nombre { get; set; }
public int Edad { get; set; }
// Relación One-to-Many con Direcciones
public List<Direccion> Direcciones { get; set; }
// Relación Many-to-Many con Cursos
public List<Inscripcion> Inscripciones { get; set; }
}
public class Curso
{
[Key]
public int CursoId { get; set; }
public string Nombre { get; set; }
public string Descripcion { get; set; }
// Relación Many-to-Many con Estudiantes
public List<Inscripcion> Inscripciones { get; set; }
}
public class Direccion
{
[Key]
public int DireccionId { get; set; }
public string Calle { get; set; }
public string Ciudad { get; set; }
public int EstudianteId { get; set; } // Clave externa a Estudiante
// Relación One-to-Many con Estudiante
public Estudiante Estudiante { get; set; }
}
public class Inscripcion
{
[Key]
public int InscripcionId { get; set; }
public int EstudianteId { get; set; }
public int CursoId { get; set; }
// Relaciones Many-to-Many
public Estudiante Estudiante { get; set; }
public Curso Curso { get; set; }
}
Paso 2: Contexto de EF Core
using Microsoft.EntityFrameworkCore;
public class EscuelaContext : DbContext
{
public DbSet<Estudiante> Estudiantes { get; set; }
public DbSet<Curso> Cursos { get; set; }
public DbSet<Direccion> Direcciones { get; set; }
public DbSet<Inscripcion> Inscripciones { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("tu_conexion_a_base_de_datos");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Configuración de la relación Many-to-Many entre Estudiante y Curso
modelBuilder.Entity<Inscripcion>()
.HasOne(i => i.Estudiante)
.WithMany(e => e.Inscripciones)
.HasForeignKey(i => i.EstudianteId);
modelBuilder.Entity<Inscripcion>()
.HasOne(i => i.Curso)
.WithMany(c => c.Inscripciones)
.HasForeignKey(i => i.CursoId);
}
}
Paso 3: Código para Insertar Datos de Prueba
using System;
using System.Collections.Generic;
using System.Linq;
public class InsertarDatos
{
public static void InsertarDatosDePrueba()
{
using (var context = new EscuelaContext())
{
// Crear estudiantes
var estudiante1 = new Estudiante { Nombre = "Juan", Edad = 20, Direcciones = new List<Direccion> { new Direccion { Calle = "Calle 1", Ciudad = "Ciudad A" } } };
var estudiante2 = new Estudiante { Nombre = "Ana", Edad = 22, Direcciones = new List<Direccion> { new Direccion { Calle = "Calle 2", Ciudad = "Ciudad B" } } };
// Crear cursos
var curso1 = new Curso { Nombre = "Matemáticas", Descripcion = "Curso de álgebra" };
var curso2 = new Curso { Nombre = "Historia", Descripcion = "Curso de historia antigua" };
// Crear inscripciones
var inscripcion1 = new Inscripcion { Estudiante = estudiante1, Curso = curso1 };
var inscripcion2 = new Inscripcion { Estudiante = estudiante1, Curso = curso2 };
var inscripcion3 = new Inscripcion { Estudiante = estudiante2, Curso = curso1 };
// Agregar datos al contexto y guardar
context.Estudiantes.AddRange(estudiante1, estudiante2);
context.Cursos.AddRange(curso1, curso2);
context.Inscripciones.AddRange(inscripcion1, inscripcion2, inscripcion3);
context.SaveChanges();
}
}
}
Paso 4: Consultas sobre Datos
Consultas simples y complejas
using System;
using System.Linq;
using Microsoft.EntityFrameworkCore;
public class Consultas
{
public static void ConsultarDatos()
{
using (var context = new EscuelaContext())
{
// 1. Consulta sencilla: Obtener todos los estudiantes y sus direcciones
var estudiantesConDirecciones = context.Estudiantes
.Include(e => e.Direcciones)
.ToList();
// 2. Consulta con join: Obtener estudiantes y cursos en los que están inscritos (dos tablas)
var estudiantesConCursos = context.Inscripciones
.Include(i => i.Estudiante)
.Include(i => i.Curso)
.Select(i => new
{
EstudianteNombre = i.Estudiante.Nombre,
CursoNombre = i.Curso.Nombre
})
.ToList();
// 3. Consulta con join de tres tablas: Estudiantes con sus direcciones y cursos
var estudiantesDireccionesCursos = context.Estudiantes
.Include(e => e.Direcciones)
.Include(e => e.Inscripciones)
.ThenInclude(i => i.Curso)
.Select(e => new
{
Estudiante = e.Nombre,
Direccion = e.Direcciones.FirstOrDefault().Calle,
Cursos = e.Inscripciones.Select(i => i.Curso.Nombre)
})
.ToList();
// 4. Consulta compleja con condiciones: Estudiantes mayores de 20 inscritos en un curso específico
var estudiantesMayoresDe20EnMatematicas = context.Inscripciones
.Where(i => i.Estudiante.Edad > 20 && i.Curso.Nombre == "Matemáticas")
.Include(i => i.Estudiante)
.Select(i => new
{
EstudianteNombre = i.Estudiante.Nombre,
CursoNombre = i.Curso.Nombre
})
.ToList();
// Imprimir resultados
Console.WriteLine("Estudiantes con Direcciones:");
foreach (var estudiante in estudiantesConDirecciones)
{
Console.WriteLine($"{estudiante.Nombre} - {estudiante.Direcciones.FirstOrDefault()?.Calle}");
}
Console.WriteLine("\nEstudiantes con Cursos:");
foreach (var inscripcion in estudiantesConCursos)
{
Console.WriteLine($"{inscripcion.EstudianteNombre} inscrito en {inscripcion.CursoNombre}");
}
Console.WriteLine("\nEstudiantes con Direcciones y Cursos:");
foreach (var estudiante in estudiantesDireccionesCursos)
{
Console.WriteLine($"{estudiante.Estudiante} - {estudiante.Direccion} - Cursos: {string.Join(", ", estudiante.Cursos)}");
}
Console.WriteLine("\nEstudiantes mayores de 20 en Matemáticas:");
foreach (var estudiante in estudiantesMayoresDe20EnMatematicas)
{
Console.WriteLine($"{estudiante.EstudianteNombre} en el curso {estudiante.CursoNombre}");
}
}
}
}
Este código cubre un escenario completo:
- Insertar datos de prueba en la base de datos.
- Realizar consultas simples y avanzadas que incluyen relaciones entre dos y tres tablas, así como filtros complejos.