none
Uso de automapper RRS feed

  • Pregunta

  • Buenas , acabo de instalar mediante nu-get el paquete automapper para poder usarlo en mi proyecto por primera vez , originalmente tenia la case Ventas y he creado una que es VentasModel que es la que quiero usar


    Actualmente en el controlador tengo este código para obtener los detalles de un registro del tipo Ventas

    public ActionResult Details(string id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Ventas ventas = db.Ventas.Find(id); if (ventas == null) { return HttpNotFound(); } return View(ventas); }

    Para ello lo primero que he hecho ha sido mediante este ejemplo que tengo de un post explicativo adaptar el código conforme lo que yo tengo


    public ActionResult Index()
    {
        AutoMapper.Mapper.CreateMap<Usuario, UsuarioViewModel>();
        var viewModel = AutoMapper.Mapper.Map<UsuarioViewModel>(UsuarioRepository.Obtener());
    
        return View(viewModel);
    }

    Pero al adaptarlo de estas forma me da una serie de errores


    AutoMapper.Mapper.CreateMap<Ventas, VentasModel>();
                var viewModel = AutoMapper.Mapper.Map<Ventas>(UsuarioRepository.Obtener());
    

    En la primera linia me da el error

    Error    2    'AutoMapper.Mapper' no contiene una definición para 'CreateMap' 

    En la seguna linia el parametro UsuarioRepository.Obtener me da error ya que no tengo definido este método , lo que no veo que es debo pasarle ahí.

    Gracias



    lunes, 22 de mayo de 2017 8:26

Respuestas

  • hola

    Pero el problema no creo que sea automapper, sino la linea que pones despues

    cual es el objetivo de

    destino = db.Ventas.Find(id);

    para que aplicas automapper para obtener "destino" si desues lo pisas con una query de EF?

    intenta usando otra variable

    var ventaSel = db.Ventas.Find(destino.Id);

    la idea es que uses otra variable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta ilernet martes, 23 de mayo de 2017 9:56
    lunes, 22 de mayo de 2017 11:12
  • hola

    Estas aplicando el Find() de EF sobre la entidad Ventas, es logico que retornes instancias de Ventas, eso es correcto

    >>El problema que tengo es que el modelo Ventas creado mediante EF me crea relaciones con otra tabla , para ello creo un modelo que es VentasModel con las propiedades básicas que necesito no?

    No entendi, para que necesitas las relaciones?

    porque podrias usar el Include() de EF para especificar que relaciones tiene que cargar

    Ademas si VentasModel mapea con Ventas porque defiens una propiedad venta dentro de VentasModel ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta ilernet martes, 23 de mayo de 2017 9:56
    lunes, 22 de mayo de 2017 15:44
  • ahh bien ahi esta mejor, obtienes las ventas y luego aplicas el automapper para convertir estos datos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta ilernet martes, 23 de mayo de 2017 9:56
    lunes, 22 de mayo de 2017 16:46

Todas las respuestas

  • He visto que en la versión que uso de automapper han hecho que sea no estático por lo que he encontrado un codigo de ejemplo y he intentado adaptarlo sin éxito

         var config = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Ventas, VentasModel>();
            });
    
            IMapper mapper = config.CreateMapper();
            var origen = new Ventas();
            var destino = mapper.Map<Ventas, VentasModel>(origen);
    
            destino = db.Ventas.Find(id);

    El error que me da en la última linia es :

    Error 1 No se puede convertir implícitamente el tipo 'testweb.Models.Ventas' en 'testweb.Models.VentasModel'

    Gracias,


    lunes, 22 de mayo de 2017 11:06
  • hola

    Pero el problema no creo que sea automapper, sino la linea que pones despues

    cual es el objetivo de

    destino = db.Ventas.Find(id);

    para que aplicas automapper para obtener "destino" si desues lo pisas con una query de EF?

    intenta usando otra variable

    var ventaSel = db.Ventas.Find(destino.Id);

    la idea es que uses otra variable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta ilernet martes, 23 de mayo de 2017 9:56
    lunes, 22 de mayo de 2017 11:12
  • El problema que tengo es que el modelo Ventas creado mediante EF me crea relaciones con otra tabla , para ello creo un modelo que es VentasModel con las propiedades básicas que necesito no?

        public partial class Ventas
        {
            public Ventas()
            {
                this.Caja = new HashSet<Caja>();
                this.Montajes = new HashSet<Montajes>();
                this.VentasLinias = new HashSet<VentasLinias>();
            }
    
            public int idCliente { get; set; }
            public byte tiendaCliente { get; set; }
            public int id { get; set; }
    	...
        
            public virtual ICollection<Caja> Caja { get; set; }
            public virtual Clientes Clientes { get; set; }
            public virtual ICollection<Montajes> Montajes { get; set; }
            public virtual Usuarios Usuarios { get; set; }
            public virtual ICollection<VentasLinias> VentasLinias { get; set; }
        }

        public class VentasModel
        {
            public int idCliente { get; set; }
            public byte tiendaCliente { get; set; }
            public int id { get; set; }
    
            public Ventas venta { get; set; }
            public List<VentasLinias> linias { get; set; }
    
        }

    Lo que intento hacer es rellenar un modelo de VentasModel , he vuelto a reescribir el código pero algo hago mal porque la variable "ventaSeleccionada" tiene la estructura del modelo "Ventas".

            public ActionResult Details(int id,string weblogin,byte tienda)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                var config = new MapperConfiguration(cfg =>
                {
                    cfg.CreateMap<Ventas, VentasModel>();
                });
    
                IMapper mapper = config.CreateMapper();
                var origen = new Ventas();
                var destino = mapper.Map<Ventas, VentasModel>(origen);
    
                var ventaSeleccionada = db.Ventas.First(x => x.id == id && x.weblogin == weblogin && x.tiendaVenta == tienda);
    
                
                if (destino == null)
                {
                    return HttpNotFound();
                }
                return View(ventaSeleccionada);
    
            }


    Gracias,





    • Editado ilernet lunes, 22 de mayo de 2017 11:31
    lunes, 22 de mayo de 2017 11:28
  • hola

    Estas aplicando el Find() de EF sobre la entidad Ventas, es logico que retornes instancias de Ventas, eso es correcto

    >>El problema que tengo es que el modelo Ventas creado mediante EF me crea relaciones con otra tabla , para ello creo un modelo que es VentasModel con las propiedades básicas que necesito no?

    No entendi, para que necesitas las relaciones?

    porque podrias usar el Include() de EF para especificar que relaciones tiene que cargar

    Ademas si VentasModel mapea con Ventas porque defiens una propiedad venta dentro de VentasModel ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta ilernet martes, 23 de mayo de 2017 9:56
    lunes, 22 de mayo de 2017 15:44
  • Gracias leandro , creo que acabo de ver la luz..

    Os dejo el código de como lo hize.

    Gracias por todo.

            public ActionResult Details(int id,string weblogin,byte tienda)
            {
     
                if (id <= 0)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                var config = new MapperConfiguration(cfg =>
                {
                    cfg.CreateMap<Ventas, VentasModel>();
                });
    
                IMapper mapper = config.CreateMapper();
                var ventaSeleccionada = db.Ventas.First(x => x.id == id && x.weblogin == weblogin && x.tiendaVenta == tienda);
                var destino = mapper.Map<Ventas, VentasModel>(ventaSeleccionada);
    
    
                if (destino == null)
                {
                    return HttpNotFound();
                }
                return View(ventaSeleccionada);
    
            }

    lunes, 22 de mayo de 2017 16:41
  • ahh bien ahi esta mejor, obtienes las ventas y luego aplicas el automapper para convertir estos datos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta ilernet martes, 23 de mayo de 2017 9:56
    lunes, 22 de mayo de 2017 16:46