我在使用自动映射器进行映射时偶然发现了此错误。我先解释一下我的用例
我创建了一个具有推荐功能的网站,顺便说一句,我使用 select2 js 进行带有搜索功能的下拉菜单,并且有一个 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(闭包,对象,ReferralViewModel,ResolutionContext)
lambda_method(闭包,对象,ReferralViewModel,ResolutionContext)
AutoMapper.Mapper.MapCore(TSource源,TDestination目的地,ResolutionContext上下文,类型sourceType,类型destinationType,IMemberMap memberMap)
AutoMapper.Mapper.Map(TSource 源,TDestination 目的地)
AutoMapper.Mapper.Map(对象源)
ProfileController.cs 中的 Genea.Areas.Admin.Controllers.ProfileController.SearchUser(字符串术语) +
var 映射用户 = _mapper.Map(用户);
我不知道为什么会发生这个错误
您已经定义/配置了从
AspNetUsers
到 ReferralViewModel
的映射,但您正在尝试将 AspNetUsers
列表映射到单个 ReferralViewModel
对象。
将映射修改为 -
var mappedUser = _mapper.Map<List<ReferralViewModel>>(users);
这应该可以解决你的问题。
与您的问题无关:
即可简化
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
软件包。)
var users = await _context.AspNetUsers
.Where(a => a.Fullname != null && a.Fullname.Contains(term))
.ToListAsync();
我也遇到了同样的问题,但就我而言,问题是配置问题。我使用的是具有 API、Web、数据、服务层的分层解决方案。配置文件存在于服务层中。
我在 Program.cs 文件中通过 AutoMapper 配置进行了定义,如下所示:
builder.Services.AddAutoMapper(Assembly.GetExecutingAssembly());
但是这里 AddAutoMapper() 想知道您在哪个 Assembly 中定义了映射配置文件。我的服务项目项目有一个 ServiceCollectionExtension (服务解析)(这里获取程序集),然后我通过此扩展添加 AutoMapper,如下所示,它起作用了:
services.AddAutoMapper(Assembly.GetExecutingAssembly());