web-dev-qa-db-fra.com

AutoMapper.Mapper ne contient pas de définition pour CreateMap

C'est peut-être une question de base, mais je me demande si je ne reçois pas la méthode AutoMapper.Mapper.CreateMap.

enter image description here

Est-ce que j'utilise une mauvaise référence/package AutoMapper? Merci

74
Sami

La version statique de la méthode CreateMap était obsolète en 4.2, puis supprimée de l'API dans la version 5.0. Jimmy Bogard en parle plus en détail dans cet article de blog .

La nouvelle technique de mappage est non statique, comme ceci (le code provient de la publication):

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

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

Voici comment j'ai utilisé AutoMapper dans mon code.

Étape 1: Téléchargé AutoMapper à travers nuget-packages.

La version est

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

Étape 1: Création DTO classe

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; }

}

Étape 2: Création d'une classe AutoMapperProfile qui hérite de Profile

using AutoMapper;
using ConcertHub.DTOs;

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

Étape 3: inscrit AutoMapperProfile dans le fichier démarrage de l'application de Global.asax

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

    }

Enfin, le morceau de code magique dans le contrôleur Api

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;
    }

J'espère que ça aide .

38
ksg

Voici comment cela fonctionne maintenant:

        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)));
        });
19
Michael K