rafael malanco velazquez
EstudianteEdinson Jesús Paternina Rivera
EstudianteKevin Castellano
EstudianteMiguel Teheran
ProfesorNicolas Guillen
EstudianteEduardo David Santiago Carrillo
EstudianteJuan Betancur
EstudianteMiguel Teheran
ProfesorMarcos Lanuza
EstudianteMiguel Teheran
ProfesorEdinson Jesús Paternina Rivera
EstudianteMiguel Teheran
ProfesorPablo Cesar Lara Londoño
EstudianteJuan Betancur
EstudianteMiguel Teheran
ProfesorRodolfo Maximo Hernández
EstudianteMiguel Teheran
ProfesorFrancisco Javier Pineda Giraldo
EstudianteMiguel Teheran
ProfesorSergio Sanchez
EstudianteJuan Fonseca
EstudianteJunier Ayala Perez
EstudianteIsrael Zapata Pacheco
EstudianteMiguel Teheran
ProfesorIsrael Zapata Pacheco
EstudianteLuis Collymoore
EstudianteEste Using que usamos para las anotaciones en el modelo ya no seria necesario: using System.ComponentModel.DataAnnotations.Schema;
¿Por qué no podría poner?
tarea.Ignore(p => p.Resumen);
Si es posible!
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.
📌 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.
Come se haría una relación de recurrencias?
Te 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
¿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?
Correcto, 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.
Porque en la definición de Categoria no creo la propiedad de "Tareas", la propiedad virtual que esta definida en el Modelo?
La propiedad virtual permite poder sobrescribirla y llenar la información que se necesite al momento de cargar la info desde SQL
Like si también hiciste mal la ForeignKey 😂
tarea.HasOne(p => p.Categoria).WithMany(p => p.Tareas).HasForeignKey(p=> p.CategoriaId);
cómo se haría una relación de mucho a muchos?
Hola 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
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?
Puedes 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...
Miguel y compañeros que significa la p en la expresión lamda p => p.atributo es Una nemotecnia? o por que la p
Bá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
yo uso item:
item => item.attribute
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
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);
});
Hola, no entiendo este error, mi relación la quiero de muchos canales a 1 usuario , alguna idea?
HasOne no se usa para Ids sino para las propiedades de referencia, aca esta la info: https://www.learnentityframeworkcore.com/configuration/fluent-api/hasone-method
Muchas gracias!!
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); }); }