none
DTO diferente a las Entidades en Web Api RRS feed

  • Pregunta

  • Hola a Todos

    Tengo una aplicación web Api, utiliza DTO de la capa de servicios y aqui mi problema, el dto no tiene todos loca campos que tiene la entidad que se encuentra en la capa de Dominio, estos campos son 6 de auditoria, por lo que no veo determinante que tambien se encuentren en el DTO y asi no sea enviado en el JSON; pero cuando recibo un PUT en el web api tengo problemas, mi codigo de actualización en el servicio es :

     public bool Update(CursoDto entity)
            {
                try
                {
                    var result = new EnCurso();
                    Mapper.Map(entity, result);
    
                    _uow.EnCurso.Update(result);
                    _uow.Complete();
                    return true;
    
                }
                catch
                {
                    return false;
                }
            }
     

    por lo tanto al crear una instancia de la entidad los 6 campos de auditoria están vacíos y cuando el automapper los junta con el DTO estos campos siguen vacio, al ejecutar las modificaciones tengo un error porque los campos de auditoria no pueden estar vacios, pero estos ya tiene informacion en la DB. como puedo solucionar este problema sin tener que los DTO tengan todos los campos de las entidades (utilizo EF 6.1.3).

    Gracias



    Luis Ormeño

    lunes, 26 de junio de 2017 18:02

Respuestas

  • Gracias a todos,

    Pude resolverlo, cambia el código de no crear una nueva instancia de la entidad,  traer el existencia y eso mapearlo con el DTO. funciono.

      public bool Update(CursoDto entity)
            {
                try
                {
                    var result = _uow.EnCurso.Get(entity.EnInCursId); 
                    Mapper.Map(entity, result);
    
                    _uow.EnCurso.Update(result);
                    _uow.Complete();
                    return true;
    
                }
                catch
                {
                    return false;
                }
            }


    Luis Ormeño

    • Marcado como respuesta Luis Ormeño A lunes, 26 de junio de 2017 19:21
    lunes, 26 de junio de 2017 19:21

Todas las respuestas

  • hola

    noto un incorrecto uso de automapper

    EnCurso result = Mapper.Map<EnCurso>(entity);

    entiendo que el mapping lo tienes definido en algun otro sitio

    >>por lo tanto al crear una instancia de la entidad los 6 campos de auditoria están vacíos

    podrias asignarlo en el mapping de automapper o desde codigo

    result.Usuario = ...;

    result.FechaActualizacion = DateTime.Now;

    asignando los campos de auditoria usando codigo despues de mapear

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 26 de junio de 2017 18:39
  • Hola Leandro

    El mapping esta en otro proyecto :

    public class MapperProfile : Profile
        {
            public MapperProfile()
            {
                CreateMap<EnCurso, CursoDto>();
                CreateMap<CursoDto, EnCurso>();
    
                CreateMap<EnTurno, TurnoDto>();
                CreateMap<TurnoDto, EnTurno>();
            }
        }

    Lo que requiero es que los 2 campos de 6 no sean modificados , que respete el contenido que se encuentra en el SQL, que es el usuario y la fecha de creación, porque estoy en la modificación y no deben ser cambiados estos dos campos.



    Luis Ormeño

    lunes, 26 de junio de 2017 19:06
  • Saludos,

    Sí como comentas no quieres que esos 2 campos sean modificados porque no lo pones RedOnly si me imagino que lo recibes por parámetro.


    Si mi respuesta te ha ayudado a resolver tus problemas, Selecciona "Proponer como respuesta"

    Blog
    J.Joaquin

    lunes, 26 de junio de 2017 19:11
  • Gracias a todos,

    Pude resolverlo, cambia el código de no crear una nueva instancia de la entidad,  traer el existencia y eso mapearlo con el DTO. funciono.

      public bool Update(CursoDto entity)
            {
                try
                {
                    var result = _uow.EnCurso.Get(entity.EnInCursId); 
                    Mapper.Map(entity, result);
    
                    _uow.EnCurso.Update(result);
                    _uow.Complete();
                    return true;
    
                }
                catch
                {
                    return false;
                }
            }


    Luis Ormeño

    • Marcado como respuesta Luis Ormeño A lunes, 26 de junio de 2017 19:21
    lunes, 26 de junio de 2017 19:21