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

Sami
fuente

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);
Will Ray
fuente
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 .

ksg
fuente
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)));
        });
Michael K
fuente
0

Veo que su clase no heredó de AutoMapper.Profile

Hice esto y trabajé para mi

public class AutoMapperConfig: AutoMapper.Profile
Jason Chen
fuente