01
Qué es y qué problema resuelve
El modelo de EF define cómo se mapea un objeto a persistencia. Fluent API permite separar esa configuración del contrato HTTP y del dominio.
Una longitud máxima, una clave y un índice tienen propósitos distintos: evitar valores incompatibles, identificar filas y facilitar consultas.
02
Ejemplo paso a paso
Punto de partida Fragmento dentro de OnModelCreating. Usa ReservaFila del material; no equivale a una migración aplicada.
Antes de ejecutar
Requiere un proyecto con EF Core 10, proveedor elegido, DbContext y entidades configurados. db, ct e identificadores representan dependencias del caso. El ZIP de consola no contiene esta integración. Verifica el esquema y las garantías con el proveedor.
var entidad = modelBuilder.Entity<ReservaFila>();
entidad.HasKey(r => r.Id);
entidad.Property(r => r.SalaId).HasMaxLength(80).IsRequired();
entidad.Property(r => r.Version).IsConcurrencyToken();
entidad.HasIndex(r => new { r.GrupoId, r.Inicio });Cómo funciona
- Localiza la entidad que configura ModelBuilder.
- Distingue clave, longitud máxima e índice: cada uno protege o facilita algo distinto.
- Revisa la migración generada para confirmar cómo se expresa cada decisión en la base.
Resultado esperado: El modelo expresa longitud, obligatoriedad, token e índice; valida el esquema generado.
03
Cuándo usarlo y qué debes evitar
No delegues todas las invariantes al mapeo. Una restricción puede proteger la base frente a escritores distintos, pero la aplicación debe ofrecer errores comprensibles.
Revisa las migraciones que genera el modelo: un cambio pequeño en C# puede generar una operación destructiva sobre datos existentes.
Ampliación opcional · contexto y variantes del tema
Modelar persistencia, relaciones y migraciones
EF Core rastrea cambios de entidades y traduce expresiones de consulta. El modelo persistido puede diferir del dominio: este curso usa una fila ReservaFila con propiedades simples para explicar SQL sin comprometer Intervalo. Un adaptador traduce entre ambos. Sala y Grupo tienen relación uno a muchos con Reserva; elige claves y comportamiento de borrado explícitos. Borrar una sala no debería borrar silenciosamente la historia de sus reservas.
Una migración contiene cambios de esquema y puede afectar datos previos. Revisa columnas obligatorias, valores iniciales, índices y operaciones destructivas; ensaya con una copia representativa y mide duración. Generar una migración no demuestra que sea segura. Aplica cambios compatibles antes de desplegar consumidores nuevos cuando convivan versiones. La reversión de código no revierte automáticamente un cambio de datos.
Usa una clave primaria para identidad, índices para consultas reales y restricciones para reglas expresables en el motor. Un índice único (SalaId, Inicio) solo impide dos inicios idénticos: no evita solapamientos arbitrarios. Un token de concurrencia solo protege modificaciones de una fila conocida. Explica esa diferencia antes de afirmar que la agenda es consistente.
Punto de partida ReservaFila es un modelo pedagógico independiente de Reserva. Los tiempos, índices y SQL deben verificarse con el proveedor elegido; no todos traducen DateTimeOffset de la misma forma.
Antes de ejecutar
Integración EF Core 10; requiere DbContext y proveedor
public sealed class ReservaFila
{
public Guid Id { get; set; }
public string GrupoId { get; set; } = "";
public string SalaId { get; set; } = "";
public DateTimeOffset Inicio { get; set; }
public DateTimeOffset Fin { get; set; }
public bool Cancelada { get; set; }
public Guid Version { get; set; }
}
// En OnModelCreating:
var reserva = modelBuilder.Entity<ReservaFila>();
reserva.HasKey(r => r.Id);
reserva.Property(r => r.GrupoId).HasMaxLength(80).IsRequired();
reserva.Property(r => r.Version).IsConcurrencyToken();
reserva.HasIndex(r => new { r.GrupoId, r.Inicio, r.Id });Resultado esperado: El modelo trata Version como token; la aplicación debe renovarlo al actualizar.
04 · Práctica guiada · opcional
Practica lo aprendido
Separa el mapeo en una configuración y revisa el SQL de su migración.
- 01Prepara el ejemplo con las dependencias indicadas en «Antes de ejecutar».
- 02Separa el mapeo en una configuración y revisa el SQL de su migración.
- 03Comprueba y registra el resultado: El modelo expresa longitud, obligatoriedad, token e índice; valida el esquema generado.
Ver solución orientativa
Comprueba columnas, restricciones e índices; el proveedor determina detalles finales.
05
Comprueba lo aprendido
Responde antes de abrir la explicación. Esta comprobación es opcional y no guarda una puntuación.
01¿HasMaxLength sustituye validar el DTO?
No. El DTO necesita rechazo temprano y el modelo protege persistencia.
02¿Qué configuración limita SalaId y cuál ayuda a buscar por grupo y horario?
HasMaxLength e IsRequired expresan límites de SalaId; el índice compuesto ayuda a consultas por grupo e inicio. Ninguna de esas líneas garantiza por sí sola horarios no solapados.
Cómo demostrar el objetivo
Compara tu práctica con estos resultados. Si solo diseñaste una prueba, registra su resultado como esperado, no como observado.
- Relacionas cada configuración con una restricción o una intención concreta.
- Revisas el esquema generado sin atribuir al índice una garantía de no solapamiento.
Qué debes recordar
- Fluent API describe el mapeo de persistencia.
- Una restricción y un índice tienen responsabilidades distintas.
Tu cuaderno · notas personales
Cuaderno local
Tus notas del contenido
Se guardan únicamente en este dispositivo. Puedes exportarlas cuando quieras.
Material de apoyo · descarga, glosario y referencias
Explicaciones, ejemplos y prácticas propios de Academia de Software. Los fragmentos de integración requieren las dependencias indicadas; el ZIP contiene el núcleo de consola. Las lecturas externas se consultan en su sitio original y conservan sus condiciones. Procedencia y condiciones de uso.