c# - Asp.net core 3.1 AutoMapperMappingException:缺少类型映射配置或不支持的映射
问题描述
我在使用 automapper 进行映射时偶然发现了这个错误。我将首先解释我的用例
我创建了一个具有推荐功能的网站,我正在使用 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:缺少类型映射配置或不支持的映射。
映射类型:
Object -> ReferralViewModel
System.Object -> Genea.Areas.Admin.Models.ReferralViewModel lambda_method(Closure , object , ReferralViewModel , ResolutionContext)
lambda_method(Closure , object , ReferralViewModel , ResolutionContext)
AutoMapper.Mapper.MapCore<TSource, TDestination >(TSource source, Tdestination destination, ResolutionContext context, Type sourceType, Type destinationType, IMemberMap memberMap)
AutoMapper.Mapper.Map<TSource, TDestination>(TSource source, Tdestination destination)
AutoMapper.Mapper.Map(object source)
Genea.Areas。 ProfileController.cs 中的 Admin.Controllers.ProfileController.SearchUser(string term) +
var mappedUser = _mapper.Map(users);
我不知道为什么会发生那个错误
解决方案
AspNetUsers
您已经从to 定义/配置了一个映射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();
推荐阅读
- python - 如何删除除 1 个特定小部件以外的所有子项?
- java - Javassist ; 引起:编译错误:没有这样的类:记录器
- javascript - 如何在 Electron BrowserWindow 中查看 PDF?
- ruby-on-rails - 如何在 ActionMailer 中将云文件添加为电子邮件附件
- php - 获取自定义支付网关数据作为 Woocommerce 3 中的设置
- go - 使用 gocql 将用户定义类型的数组插入 Cassandra
- php - 从用户数据库中获取Referer域的计数
- google-sheets - 将单元格值从 Google 表格链接到 HTML 页面
- datatables - 根据行值显示的 DataTables 按钮
- java - 使用 Selenium (Java) 自动执行某个页面时调用函数结果缺少“值”