AutoMapper.Mapper ไม่มีนิยามสำหรับ CreateMap


88

นี่อาจเป็นคำถามพื้นฐาน แต่สงสัยว่าฉันไม่ได้รับเมธอด AutoMapper.Mapper.CreateMap

ใส่คำอธิบายภาพที่นี่

ฉันใช้การอ้างอิง / แพ็คเกจ AutoMapper ผิดหรือไม่ ขอบคุณ

คำตอบ:


123

วิธีการเวอร์ชันคงที่CreateMapเลิกใช้งานแล้วใน 4.2 จากนั้นจึงนำออกจาก API ในเวอร์ชัน 5.0 Jimmy Bogard พูดถึงเรื่องนี้โดยละเอียดในโพสต์บล็อกนี้

เทคนิคใหม่สำหรับการทำแผนที่ไม่คงที่เช่นนี้ (รหัสมาจากโพสต์):

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
ขอบคุณ Will สงสัยว่าคุณสามารถแนะนำวิธีใช้ .ForMember () วิธีการได้หรือไม่เนื่องจากไม่พบคำตอบที่แน่นอนสำหรับความต้องการของฉัน
Sami

7
ขอบคุณฉันพบวิธีดังต่อไปนี้: อาจเป็นประโยชน์สำหรับผู้อื่น var configStack = new MapperConfiguration (cfg => {cfg.CreateMap <StackInfoVM, StackNameVM> () ForMember (dest => dest.stackId, opts => opts.MapFrom ( src => src.itemId));});
Sami

1
ฉันมีปัญหาเดียวกันฉันได้ลองทำตามที่คุณแนะนำแล้ว แต่ให้ข้อผิดพลาดThe type or namespace name 'MapperConfiguration' could not be found (are you missing a using directive or an assembly reference?)และเหมือนกันสำหรับIMapperCan you please help me
Divyang Desai

1
ฉันสามารถเพิ่มการกำหนดค่าการแมปทั้งหมดในการกำหนดค่าเดียวสำหรับโมเดลทั้งหมดของฉันได้หรือไม่
Master Programmer

2
@MasterProgrammer ใช่! ฉันมักจะเห็นการกำหนดค่าที่สร้างขึ้นเป็นคุณสมบัติคงที่โดยมีการแมปทั้งหมดที่สร้างขึ้นภายใน
Will Ray

45

นี่คือวิธีที่ฉันใช้ AutoMapper ในโค้ดของฉัน

ขั้นตอนที่ 1: ดาวน์โหลดAutoMapperผ่านnuget แพคเกจ

เวอร์ชันคือ

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

ขั้นตอนที่ 1: สร้างคลาส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; }

}

ขั้นตอนที่ 2: สร้างคลาสAutoMapperProfileซึ่งสืบทอดมาจากโปรไฟล์

using AutoMapper;
using ConcertHub.DTOs;

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

ขั้นตอนที่ 3: AutoMapperProfile ที่ลงทะเบียนในเมธอดApplication Startของไฟล์Global.asax

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

    }

ในที่สุดชิ้นส่วนของรหัสมหัศจรรย์ใน 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;
    }

หวังว่าจะช่วยได้


เข้าใจง่ายขึ้น. ขอบคุณ.
Najeeb

9
ดูเหมือนบทช่วยสอนของ Mosh จาก Pluralsight :-)
Casperonian

@ Casperonian คุณพูดถูกที่รัก :-) ดีใจที่ได้ช่วยเหลือผู้อื่น
ksg

อธิบายได้ดี ขอบคุณดีกว่าที่จะอธิบายในแนวทางปฏิบัติที่ดีแทนที่จะทิ้งบรรทัดของโค้ด
Jitendra Sawant

19

นี่คือวิธีการทำงานตอนนี้:

        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

ฉันเห็นว่าคลาสของคุณไม่ได้รับช่วงจาก AutoMapper โปรไฟล์

ฉันทำสิ่งนี้และได้ผลสำหรับฉัน

public class AutoMapperConfig: AutoMapper.Profile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.