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

Fluent API: restricciones y mapeo de entidades · caso de reservasC#

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

  1. Localiza la entidad que configura ModelBuilder.
  2. Distingue clave, longitud máxima e índice: cada uno protege o facilita algo distinto.
  3. 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.

Fila explícita y versión de aplicaciónC#

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.

  1. 01Prepara el ejemplo con las dependencias indicadas en «Antes de ejecutar».
  2. 02Separa el mapeo en una configuración y revisa el SQL de su migración.
  3. 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.

Guardado local automático
Material de apoyo · descarga, glosario y referencias
Libro de trabajo · Fluent API: restricciones y mapeo de entidadesLaboratorio C# · núcleo y 15 comprobaciones

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.