AutoMapper.Mapper non contiene la definizione per CreateMap


88

Questa potrebbe essere una domanda di base, ma mi chiedo che non sto ottenendo il metodo AutoMapper.Mapper.CreateMap.

inserisci qui la descrizione dell'immagine

Sto usando il riferimento / pacchetto AutoMapper sbagliato? Grazie

Risposte:


123

La versione statica del CreateMapmetodo è stata deprecata nella 4.2, quindi rimossa dall'API nella versione 5.0. Jimmy Bogard ne parla in modo più dettagliato in questo post del blog .

La nuova tecnica per la mappatura è non statica, come questa (il codice è tratto dal post):

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
Grazie Will, chiedendomi se puoi consigliare come utilizzare il metodo .ForMember (), in quanto non sono riuscito a trovare una risposta esatta alle mie esigenze.
Sami

7
Grazie ho trovato il modo seguente: potrebbe essere utile per gli altri var configStack = new MapperConfiguration (cfg => {cfg.CreateMap <StackInfoVM, StackNameVM> (). ForMember (dest => dest.stackId, opts => opts.MapFrom ( src => src.itemId));});
Sami

1
Ho lo stesso problema, ho provato come suggerito ma mi dà un errore The type or namespace name 'MapperConfiguration' could not be found (are you missing a using directive or an assembly reference?)e anche lo stesso per IMapperPuoi aiutarmi per favore.
Divyang Desai

1
Posso aggiungere tutta la configurazione della mappatura in una configurazione per tutto il mio modello?
Master Programmer

2
@MasterProgrammer Yup! Più comunemente vedo la configurazione creata come una proprietà statica con tutte le mappature create al suo interno.
Will Ray

45

Ecco come ho usato AutoMapper nel mio codice.

Passaggio 1: AutoMapper scaricato tramite pacchetti nuget .

La versione è

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

Passaggio 1: creazione della classe DTO

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

}

Passaggio 2: creazione di una classe AutoMapperProfile che eredita da Profile

using AutoMapper;
using ConcertHub.DTOs;

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

Passaggio 3: AutoMapperProfile registrato nel metodo di avvio dell'applicazione del file Global.asax

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

    }

Finalmente il pezzo magico di codice nel controller 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;
    }

Spero che sia d'aiuto .


Più facile da capire. Grazie.
Najeeb

9
Questo sembra il tutorial di Mosh da Pluralsight :-)
Casperonian

@Casperonian hai ragione caro Sorriso. Sono contento che abbia aiutato gli altri.
ksg

Ben spiegato. Grazie. Meglio spiegare in un buon modo pratico invece di scaricare semplicemente le righe di codice.
Jitendra Sawant

19

Ecco come funziona ora:

        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

Vedo che la tua classe non ha ereditato da AutoMapper.Profile

L'ho fatto e ho lavorato per me

public class AutoMapperConfig: AutoMapper.Profile
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.