Asp.net 核心 3.1 AutoMapperMappingException:缺少类型映射配置或不受支持的映射

时间:2021-02-04 06:09:33

标签: c# asp.net-core automapper

我在使用 automapper 进行映射时偶然发现了这个错误。我先解释一下我的用例

我创建了一个具有推荐功能的网站,我正在使用 select2 js 作为具有搜索功能的下拉列表 BTW,并且有一个 API 将返回 Id 和全名以选择该人将您推荐给他们的人,因为只有管理员账号才能放推荐人,所以这是所有用户的模型

public partial class AspNetUsers
{
    public string Id { get; set; }
    public string UserName { get; set; }
    public string NormalizedUserName { get; set; }
    public string Email { get; set; }
    public string NormalizedEmail { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Fullname { get; set; }
    public string NormalizedFullname { get; set; }
    public string Gender { get; set; }
    public string Password { get; set; }
    public string Referral { get; set; }
    public bool EmailConfirmed { get; set; }
    public string PasswordHash { get; set; }
    public string SecurityStamp { get; set; }
    public string ConcurrencyStamp { get; set; }
    public string PhoneNumber { get; set; }
    public bool? Active { get; set; }
    public bool? Suspended { get; set; }
    public bool PhoneNumberConfirmed { get; set; }
    public bool TwoFactorEnabled { get; set; }
    public DateTimeOffset? LockoutEnd { get; set; }
    public bool LockoutEnabled { get; set; }
    public int AccessFailedCount { get; set; }
}

我想把它映射到这个视图模型

public class ReferralViewModel
{
    public string Id { get; set; }
    public string Fullname { get; set; }
}

在我的映射配置文件中,我使用此代码

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<AspNetUsers, ProfileViewModel>();

        CreateMap<AspNetUsers, ReferralViewModel>();
    }
}

在我的启动文件中我添加了这个配置

services.AddAutoMapper(typeof(Startup));
var mappingConfig = new MapperConfiguration(mc =>
{
   mc.AddProfile(new MappingProfile());
 });
 IMapper mapper = mappingConfig.CreateMapper();
 services.AddSingleton(mapper);

并在我的代码上获取我使用它的用户

public async Task<IActionResult> SearchUser(string term)
{
        if (!string.IsNullOrEmpty(term))
        {
            var users = await _context.AspNetUsers.Where(a => a.Fullname != null).Where(a => a.Fullname.Contains(term)).ToListAsync();
           
            var mappedUser = _mapper.Map<ReferralViewModel>(users);
            return Ok(mappedUser);
        }
        else
        {
            return Ok();
        }
    }

但是当我调用方法来获取映射的用户时。它返回这样的错误

<块引用>

处理请求时发生未处理的异常。

AutoMapperMappingException:缺少类型映射配置或不支持的映射。

映射类型:
对象 -> ReferralViewModel
System.Object -> Genea.Areas.Admin.Models.ReferralViewModel lambda_method(Closure , object , ReferralViewModel , ResolutionContext)
lambda_method(Closure, object, ReferralViewModel, ResolutionContext)
AutoMapper.Mapper.MapCore(TSource source, TDestination destination, ResolutionContext context, Type sourceType, Type destinationType, IMemberMap memberMap)
AutoMapper.Mapper.Map(TSource source, TDestination destination)
AutoMapper.Mapper.Map(对象源)
Genea.Areas.Admin.Controllers.ProfileController.SearchUser(string term) in ProfileController.cs +
var mappingUser = _mapper.Map(users);

我不明白为什么会发生那个错误

1 个答案:

答案 0 :(得分:1)

您已定义/配置了从 AspNetUsersReferralViewModel 的映射,但您正尝试将 AspNetUsers 列表映射到单个 ReferralViewModel 对象。

将您的映射修改为 -

var mappedUser = _mapper.Map<List<ReferralViewModel>>(users);

那应该可以解决您的问题。

与您的问题无关:

  1. 您只需使用 -
  2. 即可简化 AutoMapper 的注册
services.AddAutoMapper(typeof(Startup));

如果 Startup 类和 MappingProfile 类在同一个程序集/项目中。如果不是,则使用 -

services.AddAutoMapper(typeof(MappingProfile));

无论哪种情况,您都不需要以下代码 -

var mappingConfig = new MapperConfiguration(mc =>
{
   mc.AddProfile(new MappingProfile());
 });
 IMapper mapper = mappingConfig.CreateMapper();
 services.AddSingleton(mapper);

(我假设您已经安装了 AutoMapper.Extensions.Microsoft.DependencyInjection 软件包。)

  1. 您可以将查询代码简化为 -
var users = await _context.AspNetUsers
    .Where(a => a.Fullname != null && a.Fullname.Contains(term))
    .ToListAsync();