AutoMapper.Mapper không chứa định nghĩa cho CreateMap


85

Đây có thể là một câu hỏi cơ bản nhưng tự hỏi tôi không nhận được phương thức AutoMapper.Mapper.CreateMap.

nhập mô tả hình ảnh ở đây

Tôi có đang sử dụng gói / tham chiếu AutoMapper sai không? Cảm ơn

Câu trả lời:


119

Phiên bản tĩnh của CreateMapphương pháp này không được dùng nữa trong 4.2, sau đó bị xóa khỏi API trong phiên bản 5.0. Jimmy Bogard nói về điều này chi tiết hơn trong bài đăng trên blog này .

Kỹ thuật mới để ánh xạ là không tĩnh, như thế này (mã lấy từ bài đăng):

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
Cảm ơn Will, tự hỏi nếu bạn có thể tư vấn cách sử dụng phương thức .ForMember (), vì không thể tìm thấy câu trả lời chính xác cho nhu cầu của tôi.
Sami

7
Cảm ơn tôi đã tìm thấy cách như bên dưới: có thể hữu ích cho những người khác var configStack = new MapperConfiguration (cfg => {cfg.CreateMap <StackInfoVM, StackNameVM> (). ForMember (dest => dest.stackId, opts => opts.MapFrom ( src => src.itemId));});
Sami

1
Tôi có cùng một vấn đề, tôi đã thử như bạn đề xuất nhưng cho tôi một lỗi The type or namespace name 'MapperConfiguration' could not be found (are you missing a using directive or an assembly reference?)và cũng giống như vậy. IMapperBạn có thể vui lòng giúp tôi không.
Divyang Desai

1
Tôi có thể thêm tất cả cấu hình ánh xạ trong một cấu hình cho tất cả mô hình của mình không?
Lập trình viên thành

2
@MasterProgrammer Yup! Tôi thường thấy cấu hình được tạo dưới dạng thuộc tính tĩnh với tất cả các ánh xạ được tạo bên trong nó.
Will Ray

42

Đây là cách tôi sử dụng AutoMapper trong mã của mình.

Bước 1: Đã tải xuống AutoMapper thông qua gói nuget .

Phiên bản là

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

Bước 1: Tạo lớp 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; }

}

Bước 2: Tạo lớp AutoMapperProfile kế thừa từ Hồ sơ

using AutoMapper;
using ConcertHub.DTOs;

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

Bước 3: Đã đăng ký AutoMapperProfile trong phương thức Bắt đầu ứng dụng của tệp Global.asax

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

    }

Cuối cùng là đoạn mã kỳ diệu trong Bộ điều khiển 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;
    }

Hy vọng nó giúp .


Dễ hiểu. Cảm ơn.
Najeeb

9
Điều này trông giống như hướng dẫn của Mosh từ Pluralsight :-)
Casperonian

@Casperonian bạn nói đúng thân yêu :-). Rất vui vì nó đã giúp ích cho người khác.
ksg

Giải thích tốt. Cảm ơn. Tốt hơn hãy giải thích theo cách Thực hành tốt thay vì chỉ đổ các dòng mã.
Jitendra Sawant

19

Đây là cách nó hoạt động bây giờ:

        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

Tôi thấy lớp của bạn không kế thừa từ AutoMapper.Profile

Tôi đã làm điều này và làm việc cho tôi

public class AutoMapperConfig: AutoMapper.Profile
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.