Resumen

Crear modelos en una API con ASP.NET y Entity Framework es el paso que convierte tus clases en tablas reales dentro de la base de datos. Aquí aprenderás a definir los modelos User y TaskItem, configurarlos con Fluent API y establecer la relación entre ambos para asignar tareas a usuarios.

¿Cómo se crean los modelos en una API con Entity Framework?

Todo arranca en una carpeta llamada Models, que debes crear si aún no existe en tu proyecto. Dentro de ella vas a definir las clases que representarán las entidades de tu base de datos [00:25].

¿Qué propiedades necesita el modelo User?

La clase User.cs necesita tres propiedades base que luego se convertirán en columnas: un identificador, un nombre y un correo. Para evitar warnings de valores nulos en strings, asigna la palabra clave default como valor inicial.

  • public int Id como identificador único.
  • public string Name con default para evitar nulos.
  • public string Email con default por la misma razón.

csharp public class User { public int Id { get; set; } public string Name { get; set; } = default!; public string Email { get; set; } = default!; }

Puedes enriquecer el modelo con datos adicionales como dirección o teléfono si quieres practicar más [01:20].

¿Cómo se define el modelo TaskItem y su relación con User?

El modelo TaskItem representa cada tarea y debe contener un identificador, un título, un estado de completitud y la referencia al usuario asignado. Aquí entra en juego la foreign key y la propiedad de navegación.

  • public int Id como clave primaria.
  • public string Title con default para evitar nulos.
  • public bool IsCompleted para marcar el estado.
  • public int UserId como clave foránea hacia User.
  • public User? User como propiedad de navegación que permite nulos.

¿Qué es una propiedad de navegación en Entity Framework? Es una propiedad dentro del modelo que apunta a otra entidad relacionada. Te permite acceder al objeto completo (por ejemplo, el usuario asignado a una tarea) sin escribir un join manual en tus queries.

¿Cómo configurar los modelos en AppDbContext?

Una vez creadas las clases, debes registrarlas en AppDbContext mediante DbSet. Esto le indica a Entity Framework que cada modelo se materializará como una tabla cuando se ejecute la migración [02:55].

csharp public DbSet<User> Users { get; set; } public DbSet<TaskItem> Tasks { get; set; }

Los nombres en plural (Users, Tasks) representan colecciones de múltiples registros. Con esto, tu base de datos tendrá dos tablas listas para recibir información.

¿Para qué sirve OnModelCreating y Fluent API?

Cuando necesitas configurar detalles específicos de columnas (longitud máxima, valores por defecto, claves foráneas), el método OnModelCreating con Fluent API es tu mejor aliado. Te permite expresar reglas de la base de datos de forma legible y centralizada.

Dentro de este método, usa expresiones lambda para acceder a cada entidad y aplicar configuraciones como ToTable, HasKey, IsRequired o HasMaxLength [04:00].

csharp protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>(entity => { entity.ToTable("Users"); entity.HasKey(e => e.Id); entity.Property(e => e.Name).IsRequired().HasMaxLength(100); entity.Property(e => e.Email).IsRequired().HasMaxLength(200); }); }

¿Qué hace HasMaxLength en Fluent API? Define el número máximo de caracteres que una columna puede almacenar. Por ejemplo, HasMaxLength(100) para el nombre y HasMaxLength(200) para el correo.

¿Cómo se configura la relación uno a muchos entre User y TaskItem?

Un usuario puede tener varias tareas asignadas, así que la relación es uno a muchos. Para representarla en Fluent API necesitas tres métodos clave: HasOne, WithMany y HasForeignKey [05:50].

csharp modelBuilder.Entity<TaskItem>(entity => { entity.ToTable("Tasks"); entity.HasKey(e => e.Id); entity.Property(e => e.Title).IsRequired().HasMaxLength(100); entity.Property(e => e.IsCompleted).HasDefaultValue(false); entity.HasOne(e => e.User) .WithMany(u => u.Tasks) .HasForeignKey(e => e.UserId); });

Para que WithMany funcione, debes agregar la propiedad de navegación inversa en User usando ICollection<TaskItem> e inicializarla como lista vacía. Así garantizas que nunca tendrás errores por una colección nula.

csharp public ICollection<TaskItem> Tasks { get; set; } = new List<TaskItem>();

Con HasDefaultValue(false) aseguras que toda nueva tarea nazca como no completada hasta que el usuario la marque manualmente.

¿Qué reto puedes hacer para practicar Fluent API?

Agrega una nueva propiedad llamada Role al modelo User y configúrala en OnModelCreating con sus propias reglas: marcarla como requerida, asignar una longitud máxima y, si quieres, definir un valor por defecto como "User". ¿Te animas a compartir tu configuración en los comentarios?