AutoMapper.Mapper no contiene una definición para CreateMap


85

Esta podría ser una pregunta básica, pero me pregunto si no obtengo el método AutoMapper.Mapper.CreateMap.

ingrese la descripción de la imagen aquí

¿Estoy usando una referencia / paquete de AutoMapper incorrecto? Gracias

Respuestas:


119

La versión estática del CreateMapmétodo quedó obsoleta en 4.2 y luego se eliminó de la API en la versión 5.0. Jimmy Bogard habla de esto con más detalle en esta publicación de blog .

La nueva técnica para el mapeo no es estática, como esta (el código es de la publicación):

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<Source, Dest>();
});

IMapper mapper = config.CreateMapper();
var source = new Source();
var dest = mapper.Map<Source, Dest>(source);

1
Gracias Will, me pregunto si puede aconsejarme cómo usar el método .ForMember (), ya que no pude encontrar la respuesta exacta a mis necesidades.
Sami

7
Gracias, encontré el camino de la siguiente manera: podría ser útil para otros var configStack = new MapperConfiguration (cfg => {cfg.CreateMap <StackInfoVM, StackNameVM> (). ForMember (dest => dest.stackId, opts => opts.MapFrom ( src => src.itemId));});
Sami

1
Tengo el mismo problema, lo intenté como sugirió, pero me da un error The type or namespace name 'MapperConfiguration' could not be found (are you missing a using directive or an assembly reference?)y también lo mismo para IMapper¿Pueden ayudarme?
Divyang Desai

1
¿Puedo agregar todas las configuraciones de mapeo en una configuración para todo mi modelo?
Programador maestro

2
@MasterProgrammer ¡Sí! Normalmente veo la configuración creada como una propiedad estática con todas las asignaciones creadas dentro de ella.
Will Ray

42

Así es como utilicé AutoMapper en mi código.

Paso 1: AutoMapper descargado a través de nuget-packages .

La versión es

<package id="AutoMapper" version="6.1.1" targetFramework="net452" />

Paso 1: Clase DTO creada

public class NotificationDTO
{

    public DateTime DateTime { get; private set; }
    public NotificationType Type { get; private set; }
    public DateTime? OriginalDateTime { get; private set; }
    public string OriginalVenue { get; private set; }
    public ConcertDTO Concert { get; set; }
}

public class ConcertDTO
{
    public int Id { get; set; }
    public bool IsCancelled { get; private set; }
    public DateTime DateTime { get; set; }
    public string Venue { get; set; }

}

Paso 2: Creó una clase AutoMapperProfile que hereda de Profile

using AutoMapper;
using ConcertHub.DTOs;

namespace ConcertHub.Models
{
  public class AutoMapperProfile : Profile
  {
    public AutoMapperProfile()
    {
        CreateMap<Concert, ConcertDTO>();
        CreateMap<Notification, NotificationDTO>();
    }
  }
}

Paso 3: AutoMapperProfile registrado en el método de inicio de la aplicación del archivo Global.asax

protected void Application_Start()
    {
        AutoMapper.Mapper.Initialize(cfg => cfg.AddProfile<AutoMapperProfile>());

    }

Finalmente la pieza mágica de código en el Api Controller

public IEnumerable<NotificationDTO> GetNewNotification()
    {
        var userId = User.Identity.GetUserId();
        var notifications = _dbContext.UserNotifications
                .Where(un => un.UserId == userId && !un.IsRead)
                .Select(un => un.Notification)
                .Include(n => n.Concert)
                .ProjectTo<NotificationDTO>()//use Automapper.QueryableExtension namespace
                .ToList();

        return notifications;
    }

Espero eso ayude .


Más fácil de entender. Gracias.
Najeeb

9
Esto se parece al tutorial de Mosh de Pluralsight :-)
Casperonian

@Casperonian tienes razón querida :-). Me alegro de haber ayudado a otros.
ksg

Bien explicado. Gracias. Es mejor explicarlo de una manera adecuada en lugar de simplemente descargar las líneas de código.
Jitendra Sawant

19

Así es como funciona ahora:

        Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<SupervisorEmployee, SupervisorViewModel>()
            .ForMember
                (dst => dst.Name, src => src.MapFrom<string>(e => SupervisorViewModel.MapName(e)))
            .ForMember
                (dst => dst.OfficePhone, src => src.MapFrom<string>(e => e.OfficePhone.FormatPhone(e.OfficePhoneIsForeign)))
            .ForMember
                (dst => dst.HomePhone, src => src.MapFrom<string>(e => e.HomePhone.FormatPhone(e.HomePhoneIsForeign)))
            .ForMember
                (dst => dst.MobilePhone, src => src.MapFrom<string>(e => e.MobilePhone.FormatPhone(e.MobilePhoneIsForeign)));
        });

0

Veo que su clase no heredó de AutoMapper.Profile

Hice esto y trabajé para mi

public class AutoMapperConfig: AutoMapper.Profile
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.