无法从一个ViewModel映射到另一个



我正在制作一个复选框列表来更新用户的角色,我正在尝试从这个映射:

public class ApplicationRoleViewModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public string NormalizedName { get; set; }
public string ConcurrencyStamp { get; set; }
public int SortOrder { get; set; }
public string DisplayName { get; set; }
public string Description { get; set; }
public string Icon { get; set; } // Font Awesome-ikoner, f.eks. "fa-user"
}

:

public class SelectableRoleViewModel
{
public Guid Id { get; set; }
public string DisplayName { get; set; }
public bool Selected { get; set; }
}
这是我的映射:
CreateMap<ApplicationRoleViewModel, SelectableRoleViewModel>()
.ForMember(dest => dest.Id, s => s.MapFrom(i => i.Id))
.ForMember(dest => dest.DisplayName, s => s.MapFrom(d => d.DisplayName))
.ForMember(dest => dest.Selected, i => i.Ignore());

在控制器中这样映射:

ApplicationRole role = await db.Roles.FirstOrDefaultAsync();
SelectableRoleViewModel sr = auto.Map<SelectableRoleViewModel>(role);

给出以下错误信息:

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

我在Startup.cs中注册AutoMapper,像这样:

services.AddAutoMapper(typeof(Startup));

然后,在AutoMapperProfile.cs中:

public class AutomapperProfile : Profile
{
public AutomapperProfile()
{
// This is not working:
CreateMap<ApplicationRoleViewModel, SelectableRoleViewModel>()
.ForMember(dest => dest.Selected, i => i.Ignore());
// This is working:
CreateMap<ApplicationUser, ApplicationUserViewModel>();
// Many more mappings, all working
}
}

我怎样才能让它工作?

您指定的代码似乎是正确的。

我只是建议删除与auto mapper自动处理相同名称的属性的ForMember方法:

CreateMap<ApplicationRoleViewModel, SelectableRoleViewModel>()
.ForMember(dest => dest.Selected, i => i.Ignore());

问题似乎是因为您没有正确使用映射器。你在哪里注册了制图员?注册在地图之前进行吗?你是在创业的时候做的吗?如果您指定更多的代码,将更容易提供帮助。

更新:

获得更多代码后&问题是,地图工作在一个不同的对象,ApplicationRoleViewModel,而不是ApplicationRole

看看有什么不同;)

public static SelectableRoleViewModel ToSelectable(this ApplicationRoleViewModel model)
{
return new SelectableRoleViewModel 
{
Id = model.Id,
DisplayName = model.DisplayName
};
}
// Usage
var selectable = applicationRole.ToSelectable();
  • 输入一次
  • 完美测试
  • 完全可维护-支持各种转换/映射
  • 减少注入的依赖和抽象(映射器)的数量
  • 没有额外的依赖于第三方库

相关内容

最新更新