Conectado a base de datos con Fluent API
Clase 16 de 25 • Curso de Fundamentos de Entity Framework
Contenido del curso
Clase 16 de 25 • Curso de Fundamentos de Entity Framework
Contenido del curso
Randall Chacón Sarmiento
KEVIN A. DERAS
Platzi Team
Gabriel Mayorga
Gustavo Medina Limon
Wilson Bienvenido Otaño Mateo
hackerman Jimenez
Miguel Teheran
José Gabriel González Pérez
Juan Sebastian Ramirez Leyva
Miguel Teheran
Alexis Gamaliel Sotelo Valdez
Miguel Teheran
Gaspar.meza
Miguel Teheran
Paulo Jirón
Miguel Teheran
Jossie Steeven Quintero Giron
Juan Betancur
Hector Hugo Luna Miranda
hackerman Jimenez
Miguel Teheran
Sergio Sanchez
Miguel Teheran
edwin marin
Miguel Teheran
Miguelangel Diaz
Miguel Teheran
José Gabriel González Pérez
Carlos Matias Avanzini
Carlos Humberto Meza Infante
Aquí les dejo mi código en inglés :)
protected override void OnModelCreating(ModelBuilder modelBuilder) //Instead Data Annotations { modelBuilder.Entity<Category>(cat =>{ cat.ToTable("Category"); cat.HasKey(p => p.CategoryId); cat.Property(p => p.Name).IsRequired().HasMaxLength(150); cat.Property(p => p.Description); }); modelBuilder.Entity<Homework>(h => { h.ToTable("Homework"); h.HasKey(p => p.HomeworkId); h.HasOne(p=> p.Category).WithMany(p => p.Homeworks).HasForeignKey(p => p.CategoryId); h.Property(p => p.Title).IsRequired().HasMaxLength(200); h.Property(p => p.Description); h.Property(p => p.PriorityHomework); h.Property(p => p.CreationDate); h.Ignore(p => p.Summary); }); }
Puedes usar task en lugar de homework.
Yo tambien lo intente dejar como Task pero en ID te arroja un error de sobreescribir una clase
Si les da error, recuerden agregar ignore del resumen
tarea.Ignore(p => p.resumen);
De manera que el código quede así:
modelBuilder.Entity<Tarea>(tarea => { tarea.ToTable("Tarea"); tarea.HasKey(p => p.TareaId); tarea.HasOne(p=> p.Categoria).WithMany(p=> p.Tareas).HasForeignKey(p=> p.CategoriaId); tarea.Property(p => p.Titulo).IsRequired().HasMaxLength(200); tarea.Property(p => p.Descripcion); tarea.Property(p => p.PrioridadTarea); tarea.Property(p => p.FechaCreacion); tarea.Ignore(p => p.resumen); });
Gracias Bro!
muchísimas gracias, hermano
Bueno , yo tengo una pregunta , cual es la utilidad realmente de la fluent API , porque yo hice una pequeña practica antes de ver todos los temas de este curso y utilice los modelos con sus parámetros por cada atributo de la clase y configure los modelos para sus relaciones hice las migraciones y funciona perfectamente la Web API minimalista que realice. Aqui es donde veo llegar la Fluent API como mejor manera de relacionar y inicializar una tabla, pero yo desde mi punto de vista veo que es como escribir 2 veces el código porque con la primera forma podes organizar tus modelos bien ordenados sin la necesidad de tener una función que inicie todas tus tablas desde el contexto, porque llega el caso de tener 50 tablas o mas y estas usando fluent API vas a tener que iniciar y relacionar las 50 tablas desde el contexto en una misma función, causando mas confusión que buenas practicas. ¿Tienen algún proyecto de ejemplo que tenga implementado la fluent API con la capacidad de tener mas de 20 tablas o 50 tablas? , para mirar cual es el abordamiento que hacen con esta Fluent API que me deja con varias dudas para implementarla en proyectos. Muchas gracias por leer y espero que esto ayude a unos como a mi.
Fluent API te permite tener un unico punto de configuracion para toda la BD siendo mas facil poder administrar los cambios que ir de modelo en modelo. Por otro lado FluenAPI cuenta con un numero mas amplio de funciones que nos permite configurar mejor la BD los atributos no cumplen con todo.
Por ejemplo esto para manejar anotaciones:
modelBuilder .Entity<Department>() .Property(t => t.Name) .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute()));
o este para configurar el concurrecy token:
modelBuilder.Entity<OfficeAssignment>() .Property(t => t.Timestamp) .IsConcurrencyToken();
Aún después de leer la explicación del profesor, sigo coincidiendo con éste comentario. No le veo la ventaja a Fluent API.
Por ejemplo, decir que "tener un único punto de configuración para toda la BD" es una ventaja, imho yo no lo veo así, las clases modelos describen la estructura de tus tablas y es así en mucho otros ORMs. Querer tener todo en sólo sitio, no lo veo como una buena práctica, de hecho lo veo como un código poco mantenible en el tiempo, en cambio si tienes la estructura en cada uno de tus modelos con Data Annotations y quieres hacer una modificación sólo vas al modelo que quieres modificar, lo actualizas y listo.
Que hayan más funcionalidades en Fluent API sólo me dice que el que hizo el módulo de Data Annotations renunció al trabajo, llegó una persona nueva y decidió no mantenerlo ni agregarle nuevas funcionalidades porque no entendía el código y creó una nueva manera de definir la estructura de la base de datos de forma un poco caprichosa. He visto algo parecido a ésta forma programática de definir la estructura de las tablas de tu DB esto en otros ORMs pero, para definir/generar las migraciones, no de ésta manera.
Por cierto, un poco imposible escribir en éste editor de texto WYSWYG, muy lento y mientras escribes bloquea funcionalidades y las palabras aparecen después de mil años y ni se te ocurra agregar un acento, te descoloca todo el texto.
Por otra parte, en general el curso muy bueno, pero, es que no entiendo cuando hacen éste tipo de cosas en tecnologías que funcionan perfectamente a través de muchos ORM y diferentes lenguajes y quieren venir a ponerlo más complicado sólo porque le agregan más funcionalidades a ésa nueva manera de hacer las cosas.
En que momento se realiza el tema de migraciones?
Cuando se crea la BD se ejecutan todas las migraciones que esten pendientes
Si al no especificar tarea.Ignore(p => p.Resumen);, el campo resumen aun asi se agregó dentro de la base de datos, entonces eso quiere decir que si no tengo nada que agregarle a una propiedad como por ejemplo : tarea.Property(p => p.PrioridadTarea); tarea.Property(p => p.FechaCreacion); No es necesario que los ponga cierto? simplemente no los pongo y aún asi se van a poner dentro de la base de datos. De esa manera tengo menos código.
Si correcto, se agregan no mas para mantener la coherencia y si toca hacer algun cambio sea mas f[acil pero no es necesario, apenas se define el modelo como Table el toma todos los cambios.
¿Como indico que una propiedad acepta valores nulos? ¿Tendran un ejemplo creando desde EF y con Fluent API?
Simplemente indicas que la propiedad puede ser nula de cualquiera de estas 2 formas: public int? Property { get; set; } public System.Nullable<int> Property { get; set; }
Igual pasa con string cuando estas usando las ultimas versiones de .NET
Si tengo herencia en mis clases como lo reflejo en EF?
En teoria deberia tomarlo automaticamente. puedes crear una clase que herede de otra, crearle su respectivo dbset y luego configurar cada propiedad de la entidad incluyendo las propiedaddes que son heredadas.
Deberían hacer un curso Profesional o Avanzado de Entity Framework.
¿Puedo borrar la base de datos desde consola?
Si puedes usar el comando de EF Drop-Database
Para ver ejemplos puedes utilizar: get-help Drop-Database -examples
¿Otra pregunta como creo las tablas en su base de datos sin hacer migraciones?
Puees generar un script SQL apartir de la estructura de la BD definida en FLuent API o puedes manualmente crear la BD con sus tablas pero deben ser iguales los tipos por obligacion
Que approach o alcance es mejor cuando se diseña data-models? o en que caso aplica cada uno?
desde .NET core 5.0 siempre se utiliza Code first la idea es tener todo el detalle de la BD directamente desde el código
Cuando el profe ejecuta dotnet run, la terminal muestra 10 errores que el profe los obvia. Además debería explicar lo de Postman. Yo no puede hacer la conexión desde Postman
Hola Edwin en .NET no es posible ejecutar una App si tiene errores. De pronto lo que salen son warnings o advertencias, estas generalmente aparecen en gran medida por que los String cambiaron en las ultimas versiones de C# y pueden ser not null.
Para llamar desde postman solo debes colocar la URL y listo no hay como mayor inconveniente. Puedes usar otras herramientas
Aca hay una lista muy interesante: https://davidcasr.medium.com/herramientas-de-testeo-de-apis-e376b2ffaa5f
Hola, alguien me puede explicar por que razón la PK generadas desde EF son char(36) y no bigints?
Tengo entendido que manejar numeros es mucho mas eficiente para la indexación.
Hola Neila, el tipo depende del que uses en tu modelo osea tu clase en C#. debes colocarlo en tipo int para que se usa int en la BD. también se utiliza muchos el tipo guid por que permite un id unico dentro del contexto de la base de datos
Parece que hay que indicar que los campos no son required en Fluent API, porque todos se crearon como Not Null :/
En mi caso no fue necesario poner la linea tarea.Ignore(p=>p.Resumen
)
Hola profe Miguel, una consulta, de acuerdo a esta respuesta, aportado por Ud.,
Fluent API te permite tener un unico punto de configuracion para toda la BD siendo mas facil poder administrar los cambios que ir de modelo en modelo. Por otro lado FluenAPI cuenta con un numero mas amplio de funciones que nos permite configurar mejor la BD los atributos no cumplen con todo.
Si estoy trabajando un proyecto web, con EF, MVC, es aconsejable usar fluent API, lo digo por el uso de clases que actuan como DTO para enviar información del controlador a la vista