AutoMapper.Mapper enthält keine Definition für CreateMap


84

Dies mag eine grundlegende Frage sein, aber ich frage mich, ob ich die AutoMapper.Mapper.CreateMap-Methode nicht erhalte.

Geben Sie hier die Bildbeschreibung ein

Benutze ich eine falsche AutoMapper-Referenz / ein falsches AutoMapper-Paket? Vielen Dank

Antworten:


117

Die statische Version der CreateMapMethode war in 4.2 veraltet und wurde dann in Version 5.0 aus der API entfernt. Jimmy Bogard spricht in diesem Blog-Beitrag ausführlicher darüber .

Die neue Technik für das Mapping ist wie folgt nicht statisch (Code stammt aus dem Beitrag):

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

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

Vielen Dank, Will, und Sie fragen sich, ob Sie Ratschläge zur Verwendung der .ForMember () -Methode geben können, da ich keine genaue Antwort für meine Anforderungen finden konnte.
Sami

6
Vielen Dank, ich habe den folgenden Weg gefunden: könnte für andere hilfreich sein var configStack = new MapperConfiguration (cfg => {cfg.CreateMap <StackInfoVM, StackNameVM> (). ForMember (dest => dest.stackId, opts => opts.MapFrom ( src => src.itemId));});
Sami

Ich habe das gleiche Problem, ich habe versucht, wie Sie vorgeschlagen, aber gibt mir einen Fehler The type or namespace name 'MapperConfiguration' could not be found (are you missing a using directive or an assembly reference?)und auch das gleiche für IMapperKönnen Sie mir bitte helfen.
Divyang Desai

Könnte ich alle Zuordnungskonfigurationen in einer Konfiguration für alle meine Modelle hinzufügen?
Master Programmer

1
@ MasterProgrammer Yup! Ich sehe die erstellte Konfiguration am häufigsten als statische Eigenschaft mit allen darin erstellten Zuordnungen.
Will Ray

42

So habe ich AutoMapper in meinem Code verwendet.

Schritt 1: AutoMapper über Nuget-Pakete heruntergeladen .

Version ist

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

Schritt 1: DTO- Klasse erstellt

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

}

Schritt 2: Erstellt eine AutoMapperProfile- Klasse, die von Profile erbt

using AutoMapper;
using ConcertHub.DTOs;

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

Schritt 3: Registriertes AutoMapperProfile in der Anwendungsstartmethode der Datei Global.asax

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

    }

Endlich der magische Code im 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;
    }

Ich hoffe es hilft .


Leichter zu verstehen. Vielen Dank.
Najeeb

9
Dies sieht aus wie Moshs Tutorial von Pluralsight :-)
Casperonian

@Casperonian du hast recht lieb :-). Ich bin froh, dass es anderen geholfen hat.
ksg

Gut erklärt. Vielen Dank. Besser in einer guten Praxis erklären, anstatt nur die Codezeilen zu löschen.
Jitendra Sawant

19

So funktioniert es jetzt:

        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

Ich sehe, dass Ihre Klasse nicht von AutoMapper.Profile geerbt hat

Ich habe das getan und für mich gearbeitet

public class AutoMapperConfig: AutoMapper.Profile
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.