【问题标题】:Automapper: "Missing type map configuration or unsupported mapping."Automapper:“缺少类型映射配置或不支持的映射。”
【发布时间】:2019-12-03 13:13:11
【问题描述】:

我得到了一个User 和一个UserListDto。我正在尝试将我的User 映射到UserListDto

但是我得到了一个,

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

当我调用 GetUsers() 而不是 GetUser(int id) 时它可以工作

用户控制器:

    [HttpGet]
    public async Task<IActionResult> GetUsers()
    {
        var users = await _repo.GetUsers();

        var usersToReturn = _mapper.Map<IEnumerable<UserForListDto>>(users);

        return Ok(usersToReturn);
    }

    [HttpGet("{id}", Name = "GetUser")]
    public IActionResult GetUser(int id)
    {
        var user = _repo.GetUser(id, false);

        var userToReturn = _mapper.Map<UserForListDto>(user);

        return Ok(userToReturn);
    }

AutoMapperProfiles:

public class AutoMapperProfiles : Profile
{
    public AutoMapperProfiles()
    {
        CreateMap<User, UserForListDto>();
        CreateMap<User, UserForDetailedDto>();
        CreateMap<UserForRegisterDto, User>();
        CreateMap<HighScoreDto, HighScore>()
        .ForMember(h=>h.TimeBetweenClicksAverage, 
        m=>m.MapFrom(u=>u.TimeBetweenClicksArray.Average()));
        CreateMap<HighScore,HighScoreForReturnDto>();



    }
}

用户:

public class User : IdentityUser<int>
{
    public virtual ICollection<UserRole> UserRoles { get; set; }
    public virtual ICollection<HighScore> HighScores { get; set; }
}

UserForDetailedDto:

public class UserForDetailedDto
{
    public int Id { get; set; }
    public string Username { get; set; }
}

【问题讨论】:

  • 查看完整的错误信息。它会准确地告诉您您缺少什么地图。
  • @LucianBargaoanu 这里是错误codepile.net/pile/eLv3JbAk

标签: asp.net-core .net-core automapper


【解决方案1】:

看起来有两个问题:1) 你不是 await 调用 _repo.GetUser 和 2) 你试图将单个 User 映射到 IEnumerable&lt;UserForListDto&gt;

确保你先await _repo.GetUser 然后_mapper.Map&lt;UserForListDto&gt;(user)

由于您没有等待 repo 调用,它正在尝试将类型 Task 映射到 UserListDto,这不是配置的映射。

【讨论】:

  • 问题是“1) 你没有等待调用 _repo.GetUser”
【解决方案2】:

看起来您可能正在尝试将单个用户对象映射到 IEnumerable 集合。在您的 GetUser(int id) 方法中,尝试以这种方式将其映射到单个 UserForListDto 对象:

_mapper.Map&lt;UserForListDto&gt;(user)

【讨论】:

  • 你的 _repo.GetUser(id, false) 方法是异步的吗?在您的错误消息中,它看起来像是在尝试映射 Task 而不是 User 对象。您可能只需要使您的 GetUser(int id) 控制器方法异步并等待 _repo.GetUser(id, false) 方法。
猜你喜欢
  • 2019-03-01
  • 2017-04-16
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多