Contenido del curso
Contenido del curso
Jesus Maria Gonzalez Guardo
Rommel Olachea
Arturo Soga
Javier Sevillano
Jhoan Sebastián Lopera Gallego
Platzi Team
Iago Carmuega
Miguel Teheran
Santiago Vasquez
Miguel Teheran
Franklin Gil
Miguel Teheran
Anderson Duarte Santos
Miguel Teheran
Steven Rendon
Miguel Teheran
Steven Rendon
Miguel Teheran
Giovanni Alzate
Germán Jesús Viola Perez
Jhoan Sebastián Lopera Gallego
Giovanni Alzate
Ángel Abad
Miguel Velarde
and_bernal
Jorge Cardona
Miguel Teheran
Sergio Sanchez
OHHH Nadie ha escrito acá... Y logramos Guardar mediante el metodo POST el objeto Tarea, asignandole un nuevo ID y la fecha.
Asi es!! =)
ahora ya soy fan de Fluent api
Hola, aun no me queda claro el potencial de Fluent api. Se puede hacer lo mismo con annotations.
Todos jaja, pero cual es mas usado?
Guardando datos con Entity framework
app.MapPost("/api/tareas", async ([FromServices] HomeworkContext dbContext, [FromBody] Homework homeworks) => { homeworks.TareaId = Guid.NewGuid(); homeworks.FechaCreacion = DateTime.Now; await dbContext.homeworks.AddAsync(homeworks); await dbContext.SaveChangesAsync(); return Results.Ok(homeworks); });
HomeworkContext, que es una instancia de la clase DbContext, para interactuar con la base de datos. La función también recibe la tarea a crear como un objeto Homework en el cuerpo de la solicitud HTTP, que se asigna a la variable "homeworks".AddAsync". Finalmente, llama al método "SaveChangesAsync" para guardar los cambios en la base de datos.Mi experiencia con async en c# es mala, en general ralentiza las ejecuciones, a no ser que se use para acelerar foreach o en procesos que no necesito esperar para seguir con mi código. Por lo que veo usas el addasync, el savechangesasync.. en este caso en concreto cuales son ventajas/desventajas de esto?
Async y el await eveitan que la aplicacion se bloquee y se quede esperando a que responda al colocar ese proceso dentro de un pull tareas o incluso dentro de otro hilo en equipos de 64 bits multicore. de alguna forma la aplicacion pueede hacer multiples tareas a la vez y as[i no se caen los request
Buen día, si quisiera INSERTAR múltiples datos con POST qué debería modificar, ya que he intentado varios métodos y no me funciona, es decir, que acepte un arreglo desde el POSTMAN y desde un foreach (mi lógica) recorrer cada iteracción e irlo insertando en la DB.
[{ "categoriaId": "528eb71c-466c-4e82-98d6-23fabe0e7956", "titulo": "Pago de servicios públicos, INTERNET", "descripcion": "Debo pagar el internet", "prioridadTarea": 2 }, { "categoriaId": "528eb71c-466c-4e82-98d6-23fabe0e7956", "titulo": "Ir al GYM", "descripcion": "Debo pagar el internet", "prioridadTarea": 2 }]
debería funcionar, recuerda agregar el SavaChanges luego de agregar todo en el foreach. debes utilizar una List<Tarea> al momento de recibirlo desde el body.
Y que va a pasar con el metodo resumen? Yo me esperaba mapearle un dato concatenando 2 valores.
Solo fue un ejemplo para mostrar que no se crear de manera automatica y puede mapearse o no, puedes usarlo sin problema y configurarlo como reto para que sigas aprendiendo de EF
Estoy trabajando en web API y estoy intentando hacer un registro de datos(Una ciudad) pero me indica que el atributo virtual(Departamento) es requerido en el método "Post" pese a que he indicado el parámetro [JSONIGNORE] en el modelo(TblCiudad). Por favor su ayuda.
Modelo Departamento
public class TblDepartamento { public int DepartamentoId { get; set; } public string Departamento { get; set; } public string CodigoPais { get; set; } public bool Activo { get; set; } }
Modelo Ciudad
public class TblCiudad { public int CiudadId { get; set; } public string Ciudad { get; set; } public string Codigo { get; set; } public decimal Flete { get; set; } public bool Activa { get; set; } public int DepartamentoId { get; set; } [JsonIgnore] public virtual TblDepartamento Departamento { get; set; } }
Context
modelBuilder.Entity<TblDepartamento>(departamento => { departamento.ToTable("TBL_DEPARTAMENTOS"); departamento.HasKey(t => t.DepartamentoId); departamento.Property(t => t.Departamento); departamento.Property(t => t.CodigoPais); departamento.Property(t => t.Activo); departamento.HasIndex(t => t.Departamento).IsUnique(true); }); modelBuilder.Entity<TblCiudad>(ciudad => { ciudad.ToTable("TBL_CIUDADES"); ciudad.HasKey(t => t.CiudadId); ciudad.Property(t => t.Ciudad); ciudad.Property(t => t.Codigo); ciudad.Property(t => t.Flete).HasColumnType("decimal"); ciudad.Property(t => t.Activa); ciudad.HasOne(t => t.Departamento).WithMany() .HasForeignKey(t => t.DepartamentoId); ciudad.HasIndex(t => t.Ciudad).IsUnique(true); });
Petición post en donde se genera el problema
[HttpPost] public ActionResult<string> Post([FromServices] Context context, [FromBody] TblCiudad cdd) { try { context.Ciudades.Add(cdd); context.SaveChanges(); return Ok(JsonSerializer.Serialize(cdd)); } catch (Exception e) { return BadRequest(String.Format("Se ha presentado un error {1}, Detalles: {2}", e.Message, e.InnerException)); } }
Mensaje de error
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "00-231a89025df5ac3c1e938f622f60daf6-04624b91ec755a87-00", "errors": { "Departamento": [ "The Departamento field is required." ] } }
Intentare trabajar para solucionar el problema pero agradecería mucho si me pueden ayudar o guiar en este tema. Muchas gracias, Saludos!
El ID que estas pasando de para el departamento (DepartamentoId) estas seguro de que existe? No tiene que pasar todo el objeto departamento pero si debes pasar un ID de departamento que exista y que sea válido para no romper la relación que existe entre las tablas.
Cual es la diferencia entre los metodos Async y no Async ??
Async significa que los métodos son asincronos ayudando al rendimiento de la aplicación ya que la aplicación puede utilizar diferentes hilos o un pool de para hacer la ejecución del programa
Yo tengo una duda. Hay una forma de que todo el trabajo de Entity se pueda hacer de otra forma ,porque veo que en una api un poco màs robusta llenariamos el programa de consultas en caso de que sea necesario, o no se si realmente el objetivo de una api es tener pocas consultas . Gracias !!!
Lo ideal es ir creando servicios que encapsulen la lógica de lo que se hace en EF y sea mas fácil de leer el código. En el curso de APIs vas a ver algunos ejemplos.
Siento que estoy adquiriendo poderes con este curso :D
aqui dejo mi version en en VS 2022 usando webApi normal:
[HttpPost("CrearTarea")] public async Task<ActionResult> CrearTarea([FromBody] TareaDTO tareadto) { try { var validarCat = await _context.Categorias.FindAsync(tareadto.CategoriaId); if (validarCat == null) throw new Exception("No existe categoria para esa tarea"); var tarea = _mapeo.Map<Tarea>(tareadto); tarea.TareaId = Guid.NewGuid(); tarea.FechaCreacion = DateTime.UtcNow; await _context.AddAsync(tarea); await _context.SaveChangesAsync(); return Ok(); } catch (Exception ex) { throw ex; } }
Que son los Dto´s ?, en este caso que archivos reemplazarían ?
es una clase especial donde encapsulamos los datos que le queremos mostrar al cliente que esta haciendo la solicitud, muchas ocasiones no queremos mostrarle todos los datos al usuario final y con esta capa de DTO podemos aislar e instanciar ciertos atributos del Modelo
En este clase aprendimos como agregar una tarea con el método MapPost, con el atributo FromBody podemos crear una propiedad que sirva para enviar los elementos por el cuerpo de la petición.
Si estuviera usando Store Procedures ¿como lo mando llamar o como lo ejecuto usando Fluent Api?
Me sale el siguiente error de compilación
error CS1593: El delegado 'RequestDelegate' no toma 2 argumentos
Pero el código esta igual al que se encuentra en el curso
Tengo el siguiente error solo sucede con el metodo POST porque cuando uso el GET funciona correctamente.
fail: Microsoft.EntityFrameworkCore.Database.Connection[20004] An error occurred using the connection to database 'prueba' on server 'localhost\SQLEXPRESS'.
En diferentes sitios veo que puede ser problemas de la cadena de conexión, pero no tendría logica ya que para leer si funciona.
Cadena de conexion:
builder.Services.AddSqlServer<TareasContext>("Data Source=localhost\SQLEXPRESS;Initial Catalog=prueba; user id=sa; password=1234; TrustServerCertificate=True");
Alguna idea?
Lo mas probable por lo que describes es que el usuario no tengas permisos para escribir en la BD solo para leer. por favor revisa esa configuración.
yo tuve el mismo error, lo solucione en MS SQL Studio, modificando los permisos de mi usuario.