Principales respuestas
Implementar un PUT (Web Api) con repositorios

Pregunta
-
Hola! pondré un ejemplo para dar a explicar mi pregunta.
Tengo un proyecto web api y tengo la entidad Person. Hago un controlador por scaffolding y el código que me genera para el PutPerson es el siguiente:
[ResponseType(typeof(void))] public IHttpActionResult PutPerson(int id, Person person) { if (!ModelState.IsValid) { return BadRequest(ModelState); } if (id != person.PersonId) { return BadRequest(); } db.Entry(person).State = EntityState.Modified; try { db.SaveChanges(); } catch (DbUpdateConcurrencyException) { if (!PersonExists(id)) { return NotFound(); } else { throw; } } return StatusCode(HttpStatusCode.NoContent); }
Pero ahora he creado un proyecto nuevo, una librería de clases (Domain Model) en donde tengo: Entidades, Interfaces y repositorios.
//Interface IHttpActionResult PutPerson(int id, Person person)
Pero en el repositorio solo podría poner
IHttpActionResult PutPerson(int id, Person person) { db.Entry(person).State = EntityState.Modified; db.SaveChanges(); {
Pero el catch que genera el scaffolding DbUpdateConcurrencyException no lo puedo validar desde el repositorio, o al menos no me parece correcto hacerlo ya que estaría dependiendo de las respuestas y me parece que eso debería validarse en el controlador. Como se podría hacer en ese caso ?
Gracias
Respuestas
-
>>Pero en el repositorio solo podría poner
si vamos al caso desde el repositorio tampoco podrias enviar un IHttpActionResult
porque un repositorio tendria que entender de http ? a los sumo el repositorio devolvera true/false si realizo o no la operacion, o simplemente un void y sino hay exception estaria todo correcto
>>Pero el catch que genera el scaffolding DbUpdateConcurrencyException no lo puedo validar desde el repositorio
porque no ? esa es una exceptio de EF o sea de persistencia es justament en el repositorio donde lo validas
si podrias convertir el error si capturas un DbUpdateConcurrencyException devolver otro exception mas generica con el mensaje
public void PutPerson(int id, Person person) {
try{ db.Entry(person).State = EntityState.Modified; db.SaveChanges();
} catch(DbUpdateConcurrencyException ex){
//aqui logueas el error
throw new Exception("mensaje personalizado", ex);
} }
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Editado Leandro TuttiniMVP martes, 26 de enero de 2016 2:12
- Marcado como respuesta Erick Salazar martes, 26 de enero de 2016 3:49
Todas las respuestas
-
>>Pero en el repositorio solo podría poner
si vamos al caso desde el repositorio tampoco podrias enviar un IHttpActionResult
porque un repositorio tendria que entender de http ? a los sumo el repositorio devolvera true/false si realizo o no la operacion, o simplemente un void y sino hay exception estaria todo correcto
>>Pero el catch que genera el scaffolding DbUpdateConcurrencyException no lo puedo validar desde el repositorio
porque no ? esa es una exceptio de EF o sea de persistencia es justament en el repositorio donde lo validas
si podrias convertir el error si capturas un DbUpdateConcurrencyException devolver otro exception mas generica con el mensaje
public void PutPerson(int id, Person person) {
try{ db.Entry(person).State = EntityState.Modified; db.SaveChanges();
} catch(DbUpdateConcurrencyException ex){
//aqui logueas el error
throw new Exception("mensaje personalizado", ex);
} }
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Editado Leandro TuttiniMVP martes, 26 de enero de 2016 2:12
- Marcado como respuesta Erick Salazar martes, 26 de enero de 2016 3:49
-