Automapper强迫我映射每个属性

时间:2018-04-13 15:08:59

标签: c# asp.net-core automapper

我有两个这样的课程:

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中不存在IdentityUserRegistrationViewModel中存在的所有其他属性设置为默认值,因为我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,这是预期的行为还是我错过了什么?

3 个答案:

答案 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);

    ...
}