none
Implementar un PUT (Web Api) con repositorios RRS feed

  • 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



    martes, 26 de enero de 2016 0:43

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


    martes, 26 de enero de 2016 2:11

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


    martes, 26 de enero de 2016 2:11
  • Perfecto, muchas gracias Leandro!
    martes, 26 de enero de 2016 3:49