Kevin Castellano
¿Por qué no podría poner?
tarea.Ignore(p => p.Resumen);
Miguel Teheran
ProfesorSi es posible!
Nicolas Guillen
El único problema que le veo a usar Fluent API es tener que actualizar el modelo y el contexto. Ahora por cada propiedad nueva, eliminada o modificada, hay que ir a context y hacer el cambio también. Depende del caso de uso pero para aplicaciones pequeñas yo sólo usaría DataAnnotations, y sólo usaría Fluent API en caso de ser necesario.
Eduardo David Santiago Carrillo
📌 No necesitas editar el DbContext cada vez que usas Fluent API.
Usa IEntityTypeConfiguration<T> para separar la lógica:
csharpCopiarEditarpublic class PersonaConfig : IEntityTypeConfiguration<Persona>
{
public void Configure(EntityTypeBuilder<Persona> builder)
{
builder.Property(p => p.Nombre).HasMaxLength(100);
}
}
Y en el DbContext:
csharpCopiarEditarprotected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new PersonaConfig());
}
✅ Así el modelo queda limpio, y no repites nada en el DbContext.
✔ Fluent API sin dolor.
Juan Betancur
Come se haría una relación de recurrencias?
Miguel Teheran
ProfesorTe refieres a una relación de muchos a muchos? de ese ya tenemos una respuesta
Este es un ejemplo de N:N, en lugar de poner WithMany usar WithOne:
modelBuilder.Entity<Author>() .HasOne(a => a.Biography) .WithOne(b => b.Author) .HasForeignKey<AuthorBiography>(b => b.AuthorRef);
Este seria un ejemplo de muchos con muchos: modelBuilder.Entity<BookCategory>() .HasKey(bc => new { bc.BookId, bc.CategoryId }); modelBuilder.Entity<BookCategory>() .HasOne(bc => bc.Book) .WithMany(b => b.BookCategories) .HasForeignKey(bc => bc.BookId); modelBuilder.Entity<BookCategory>() .HasOne(bc => bc.Category) .WithMany(c => c.BookCategories) .HasForeignKey(bc => bc.CategoryId);
Para mas info te recomiendo este sitio: https://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration
Marcos Lanuza
¿Qué pasa con el mapeo de las propiedades virtuales? En este caso, la propiedad categoría dentro de Tarea. Esa puedo asumir que se mapea utilizando la llave foránea, verdad?
Miguel Teheran
ProfesorCorrecto, si se coloca como Virtual el interpreta que es como si fuera una foránea y nos sirve para llenar la información relacionada al momento de hacer un query.
Edinson Jesús Paternina Rivera
Porque en la definición de Categoria no creo la propiedad de "Tareas", la propiedad virtual que esta definida en el Modelo?
Miguel Teheran
ProfesorLa propiedad virtual permite poder sobrescribirla y llenar la información que se necesite al momento de cargar la info desde SQL
Pablo Cesar Lara Londoño
Like si también hiciste mal la ForeignKey 😂
tarea.HasOne(p => p.Categoria).WithMany(p => p.Tareas).HasForeignKey(p=> p.CategoriaId);
Junier Ayala Perez
modelBuilder.Entity<Tarea>(tarea =>
{
tarea.ToTable("Tarea");
tarea.HasKey(p => p.TareaId);
tarea.Property(p => p.Titulo).IsRequired().HasMaxLength(200);
tarea.Property(p => p.Descripcion).IsRequired(false).HasMaxLength(500);
tarea.Property(p => p.PrioridadTarea).IsRequired();
tarea.Property(p => p.FechaCreacion).IsRequired();
// Relación entre Tarea y Categoria
tarea.HasOne(p => p.Categoria)
.WithMany(c => c.Tareas)
.HasForeignKey(p => p.CategoriaId);
});
Juan Betancur
cómo se haría una relación de mucho a muchos?
Miguel Teheran
ProfesorHola Juan puedes consultar esta documentación para poder lograrlo, es bastante sencillo y simplemente usas el Many para ambas referencias en una tabla intermedia que relacione tus 2 tablas: https://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration
Rodolfo Maximo Hernández
Cuando se tienen más modelos y se necesita realizar las restricciones con Fluent API, ¿es recomendable seguir haciendo dicha configuración en el archivo de contexto? ¿Si no es así, como se debería realizar?
Miguel Teheran
ProfesorPuedes crear diferentes clases que reciban el contexto de EF como párametro. lo modifiquen y distribuir la lógica cuando va creciendo mucho. Puedes hacerla por nucleos de negocios, UsuariosConfig por ejemplo para todo lo relacionado a usuarios, roles y permisos y asi...
Francisco Javier Pineda Giraldo
Miguel y compañeros que significa la p en la expresión lamda p => p.atributo es Una nemotecnia? o por que la p
Miguel Teheran
ProfesorBásicamente estas creando una función anonima y necesitas colocar un alias al parámetro, yo generalmente uso la 'p' pero depende mucho de la forma de programar
Sergio Sanc
yo uso item:
item => item.attribute
Juan Fonseca
Solo quiero comentar que lo que dice en cuanto a nombrar las tablas en singular no es verdad. Las tablas se nombran en plural ya que guardan varios registros (entonces no guardo una "tarea", guardo varias "tareas". Es por eso que en la creación de la BD el Framework creó las tablas en plural
Israel Zapata Pacheco
Hola, no entiendo este error, mi relación la quiero de muchos canales a 1 usuario , alguna idea?
Miguel Teheran
ProfesorHasOne no se usa para Ids sino para las propiedades de referencia, aca esta la info: https://www.learnentityframeworkcore.com/configuration/fluent-api/hasone-method
Israel Zapata Pacheco
Muchas gracias!!
Luis Collymoore
modelBuilder.Entity<Tarea>(tarea => { tarea.ToTable("Tarea"); tarea.HasKey(c => c.TareaId); tarea.HasOne(c => c.Categoria).WithMany(c => c.Tareas).HasForeignKey(c => c.CategoriaId); tarea.Property(c => c.Titulo).HasMaxLength(200).IsRequired(); tarea.Property(c => c.Descripcion); tarea.Property(c => c.PrioridadTarea); tarea.Property(c => c.FechaCreacion); }); }