none
Problema con AutoMapper RRS feed

  • Pregunta

  • Hola amigos, estoy teniendo un problema dentro de mi proyecto. Explico :

    Estoy trabajando con EF y automapper para crear mi capa entidad tengo la siguiente clase : 

    public class PedidoDTO
        {
            public string idPedido{ get; set; }
            public LibroDTO libro{ get; set; }
            public AlumnoDTO alumno { get; set; }
            public DateTime fechaIngreso { get; set; }
            public DateTime fechaDevolucion { get; set; }
            public Boolean devuelto { get; set; }
        }


    Dejo AlumnoDTO y LibroDTO tambien :

    public class LibroDTO
        {
            public string idLibro { get; set; }
            public Boolean ejemplar { get; set; }
            public string titulo { get; set; }
            public string autor { get; set; }
            public string idioma { get; set; }
            public byte[] foto { get; set; }
            public string descripcion { get; set; }
            public Boolean prestado { get; set; }
        }


     public class AlumnoDTO
        {
            public string nombre { get; set; }
            public string rut { get; set; }
            public string email { get; set; }
            public Boolean activo { get; set; }
        }


    Mi metodo del AutoMapper :

     public static Pedido mapearPedidoDTO(PedidoDTO pedido)
            {
                Mapper.CreateMap<PedidoDTO, Pedido>()
                .ForMember(t => t.Rut_Alumno, f => f.MapFrom(r => r.alumno.rut))
                .ForMember(t => t.Id_Pedido, f => f.MapFrom(r => r.idPedido))
                .ForMember(t => t.Id_Libro, f => f.MapFrom(r => r.libro.idLibro))
                .ForMember(t => t.Devuelto, f => f.MapFrom(r => r.devuelto))
                .ForMember(t => t.Fecha_Ingreso, f => f.MapFrom(r => r.fechaIngreso))
                .ForMember(t => t.Fecha_Devolucion, f => f.MapFrom(r => r.fechaDevolucion));
                Pedido nuevoPedido = Mapper.Map<PedidoDTO, Pedido>(pedido);
                return nuevoPedido;
            }


    Y cuando llego a ese metodo me tira el siguiente error :

    "

    Missing type map configuration or unsupported mapping.

    Mapping types:
    AlumnoDTO -> Alumno
    CapaEntidad.AlumnoDTO -> C_DAL.Alumno"

    La verdad antes estaba en un error de POO por eso cambie los atributos de Pedido por objetos y no campos de esos objetos. Y la vdd no se cual podria ser el error.

    De ante mano, gracias.


    Nicolás Hernández Chile

    miércoles, 30 de octubre de 2013 2:47

Respuestas

  • Hola leandro, mira hice esto :

    public static Pedido mapearPedidoDTO(PedidoDTO pedido)
            {
                Mapper.CreateMap<AlumnoDTO, Alumno>();
                Mapper.CreateMap<LibroDTO, Libro>();
                Mapper.CreateMap<PedidoDTO, Pedido>()
                .ForMember(t => t.Rut_Alumno, f => f.MapFrom(r => r.alumno.rut))
                .ForMember(t => t.Id_Pedido, f => f.MapFrom(r => r.idPedido))
                .ForMember(t => t.Id_Libro, f => f.MapFrom(r => r.libro.idLibro))
                .ForMember(t => t.Devuelto, f => f.MapFrom(r => r.devuelto))
                .ForMember(t => t.Fecha_Ingreso, f => f.MapFrom(r => r.fechaIngreso))
                .ForMember(t => t.Fecha_Devolucion, f => f.MapFrom(r => r.fechaDevolucion));
                var nuevoPedido = Mapper.Map<PedidoDTO, Pedido>(pedido);
                return nuevoPedido;
            }

    Y ya no me tira la excepcion pero ahora me ocurre otro problema :

    public static void agregarPedido(Pedido pedido)
            {
                using (BibliotecaEntities1 conectorBd = new BibliotecaEntities1())
                {
                    conectorBd.Pedido.AddObject(pedido);
                    conectorBd.SaveChanges();
                }
            }

    "System.Data.SqlClient.SqlException: Infracción de la restricción PRIMARY KEY 'PK_Alumno'. No se puede insertar una clave duplicada en el objeto 'dbo.Alumno'."

     y la cosa, es que nunca intento acceder a mi objetos dbo.Alumno.. entonces no entiendo la excepcion de duplicacion :s, alguna solucion?



    Nicolás Hernández Chile


    • Editado NicolasHT miércoles, 30 de octubre de 2013 13:49
    • Marcado como respuesta NicolasHT miércoles, 30 de octubre de 2013 14:32
    miércoles, 30 de octubre de 2013 13:46

Todas las respuestas

  • hola

    pero donde defines el Mapper.CreateMap<>() de LibroDTO  y AlumnoDTO ?

    porque de estos tambien deberias definir el map, o sino ver de marcar de alguna formas las propiedades

            public LibroDTO libro{ get; set; }        

           public AlumnoDTO alumno { get; set; }

    para que sean ignoradas en la conversion

    autommaper Ignore

    ---

    una aclaracion, si estas suando MVC no es alli en el metodo donde defines el Mapper.CreateMap<>()

    sino que este se registra

    Using Automapper with ASP.NET MVC application

    como veras se definen en una clase que hereda de Profile

    y luego se registran dentro del Global.asax cuando se inicia para que esten todos los mapeos disponibles de forma global para el sitio

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    miércoles, 30 de octubre de 2013 10:22
  • Hola Leandro, muchas gracias por responder.

    tengo una clase mapearEntidades donde tengo diferentes metodos entre ellos el AlumnoDTO y el LibroDTO.

    ¿Dentro del mapearPedidoDTO debe ir un mapeo de Alumno y Libro?

    Porque mi PedidoDTO tiene objetos de AlumnoDTO y LibroDTO, pero mi Pedido(Entity Framework) solo tiene rut del alumno e id del libro, no entiendo donde deberia ir el mapeo.

    No estoy ocupando MVC.

    Slds y gracias, espero que pueda encontrar la solucion.


    Nicolás Hernández Chile

    miércoles, 30 de octubre de 2013 12:47
  • Hola leandro, mira hice esto :

    public static Pedido mapearPedidoDTO(PedidoDTO pedido)
            {
                Mapper.CreateMap<AlumnoDTO, Alumno>();
                Mapper.CreateMap<LibroDTO, Libro>();
                Mapper.CreateMap<PedidoDTO, Pedido>()
                .ForMember(t => t.Rut_Alumno, f => f.MapFrom(r => r.alumno.rut))
                .ForMember(t => t.Id_Pedido, f => f.MapFrom(r => r.idPedido))
                .ForMember(t => t.Id_Libro, f => f.MapFrom(r => r.libro.idLibro))
                .ForMember(t => t.Devuelto, f => f.MapFrom(r => r.devuelto))
                .ForMember(t => t.Fecha_Ingreso, f => f.MapFrom(r => r.fechaIngreso))
                .ForMember(t => t.Fecha_Devolucion, f => f.MapFrom(r => r.fechaDevolucion));
                var nuevoPedido = Mapper.Map<PedidoDTO, Pedido>(pedido);
                return nuevoPedido;
            }

    Y ya no me tira la excepcion pero ahora me ocurre otro problema :

    public static void agregarPedido(Pedido pedido)
            {
                using (BibliotecaEntities1 conectorBd = new BibliotecaEntities1())
                {
                    conectorBd.Pedido.AddObject(pedido);
                    conectorBd.SaveChanges();
                }
            }

    "System.Data.SqlClient.SqlException: Infracción de la restricción PRIMARY KEY 'PK_Alumno'. No se puede insertar una clave duplicada en el objeto 'dbo.Alumno'."

     y la cosa, es que nunca intento acceder a mi objetos dbo.Alumno.. entonces no entiendo la excepcion de duplicacion :s, alguna solucion?



    Nicolás Hernández Chile


    • Editado NicolasHT miércoles, 30 de octubre de 2013 13:49
    • Marcado como respuesta NicolasHT miércoles, 30 de octubre de 2013 14:32
    miércoles, 30 de octubre de 2013 13:46
  • recuerda que cuando haces SaveChanges de una entidad que tiene relacion con otras

    estas tambien interfieren en la operacion de Add

    por lo que valida si la entidad alumno y libro no debes marcarlo para actualizar o quizas para que no se realicen ninguna accion

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 30 de octubre de 2013 13:59
  • Te refieres a que valide si el alumno y el libro existen? si existe no realice ninguna operacion? la idea de mi Pedido es tener el rut del alumno y el id del libro que pidio, QUE YA EXISTEN en la base de datos.. si valido y no hago ninguna relacion, como puedo guardar en mi base de datos el pedido....?

    Nicolás Hernández Chile

    miércoles, 30 de octubre de 2013 14:02