AutoMapper.Mapper不包含CreateMap的定义


85

这可能是一个基本问题,但想知道我没有得到AutoMapper.Mapper.CreateMap方法。

在此处输入图片说明

我使用了错误的AutoMapper参考/软件包吗?谢谢

Answers:


119

CreateMap方法的静态版本在4.2中已弃用,然后在5.0版中从API中删除。吉米•鲍嘉(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()方法,因为找不到我需要的确切答案。
萨米

7
谢谢,我发现了下面的方法:可能对其他人有用src => src.itemId));});
萨米

1
我有同样的问题,我已经按照您的建议进行了尝试,但给了我一个错误The type or namespace name 'MapperConfiguration' could not be found (are you missing a using directive or an assembly reference?)IMapper请问您也可以帮我吗?
Divyang Desai

1
我可以为我的所有模型在一个配置中添加所有映射配置吗?
Master Programmer

2
@MasterProgrammer是的!我最通常将配置创建为带有所有内部映射的静态属性。
Will Ray

42

这是我在代码中使用AutoMapper的方式。

步骤1:通过nuget-packages下载了AutoMapper

版本是

<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步:创建一个从Profile继承的AutoMapperProfile

using AutoMapper;
using ConcertHub.DTOs;

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

步骤3:在Global.asax文件的Application Start方法中注册AutoMapperProfile

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

    }

最后是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;
    }

希望能帮助到你 。


更容易理解。谢谢。
Najeeb

9
这看起来像Mosh的Pluralsight教程:-)
Casperonian

@Casperonian,你是对的亲爱的:-)。很高兴它帮助了其他人。
ksg '18

好解释。谢谢。更好地以一种良好的实践方式进行解释,而不仅仅是转储代码行。
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.Profile

我做到了,为我工作

public class AutoMapperConfig: AutoMapper.Profile
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.