我有两个这样的课程:
public class RegistrationViewModel
{
public string Password { get; set; }
public string Username { get; set; }
public List<string> Roles { get; set; }
}
public class ApplicationUser : IdentityUser
{
}
我想将RegistrationViewModel
映射到ApplicationUser
,所以这里是映射配置:
public class ViewModelToEntityMappingProfile : Profile
{
public ViewModelToEntityMappingProfile()
{
CreateMap<RegistrationViewModel, ApplicationUser>().ForMember(au => au.UserName, map => map.MapFrom(vm => vm.Email));
}
}
我在我的Services.cs
文件中将AutoMapper添加到项目中:
services.AddAutoMapper();
我期待的是RegistrationViewModel.Roles
在映射过程中会被忽略,因为ApplicationUser
中不存在IdentityUser
,RegistrationViewModel
中存在的所有其他属性设置为默认值,因为我var userIdentity = _mapper.Map<ApplicationUser>(model);
没有它们。
我这样调用地图:
IdentityUser
但这会产生以下异常:
处理请求时发生未处理的异常。
AutoMapperConfigurationException:找到未映射的成员。评论 下面的类型和成员。添加自定义映射表达式,忽略, 添加自定义解析程序,或修改源/目标类型否 匹配构造函数,添加一个无参数ctor,添加可选参数,或 映射所有构造函数参数 ================================================== ================================================== ==================================== RegistrationViewModel - &gt; ApplicationUser(目标成员列表) Storefy.ServicesLayer.ViewModels.ViewModels.Authentication.RegistrationViewModel - &GT; Storefy.BusinesLayer.Entities.Users.ApplicationUser(目标成员列表)
未映射的属性: AccessFailedCount EmailConfirmed LockoutEnabled LockoutEnd PhoneNumberConfirmed TwoFactorEnabled ID NormalizedUserName 电子邮件 NormalizedEmail PasswordHash SecurityStamp ConcurrencyStamp ******中国
似乎AutoMapper期望映射{{1}}中的所有属性。这是我第一次使用AutoMapper,这是预期的行为还是我错过了什么?
答案 0 :(得分:2)
AutoMapper有一种忽略属性的扩展方法。例如,您可以这样写:
CreateMap<RegistrationViewModel, ApplicationUser>()
.ForMember(dest => dest.Roles, opt => opt.Ignore())
答案 1 :(得分:1)
我遇到了同样的问题,所以我为此写了一个扩展方法。
public static IMappingExpression<TSource, TDest> IgnoreAll<TSource, TDest>(this IMappingExpression<TSource, TDest> e)
{
e.ForAllMembers(x => x.Ignore());
return e;
}
答案 2 :(得分:-1)
如果将来有人来到这里,事实证明我的映射配置在另一个项目中,而AutoMapper甚至没有读过它。
而不是
services.AddAutoMapper()
在Services.cs
中的我必须以这种方式将AutoMapper添加到我的项目中:
public void ConfigureServices(IServiceCollection services)
{
...
var config = new AutoMapper.MapperConfiguration(cfg =>
{
cfg.AddProfile(new AutoMapperProfileConfiguration());
});
var mapper = config.CreateMapper();
services.AddSingleton(mapper);
...
}