AutoMapper 失败的原因可能是什么?

What could be reason of AutoMapper failed?

我认为 AutoMapper 失败的原因是域模型和视图模型的字段略有不同。 这是领域模型:

public partial class Users
    {
        public int Id { get; set; }
        public string Login { get; set; }
        public string Password { get; set; }
        public int RoleId { get; set; } 
        public virtual UserRoles UserRoles { get; set; }
    }

这是视图模型:

 public class UsersViewModel
    {
        public int Id { get; set; }
        [Required]
        [MinLength(3, ErrorMessage = "Минимальная длина логина - 3 символа")]
        [MaxLength(50, ErrorMessage = "Максимальная длина логина - 50 символов")]
        [Display(Name = "Логин")]
        public string Login { get; set; }
        [Required]
        [MinLength(8, ErrorMessage = "Минимальная длина пароля - 8 символов")]
        [MaxLength(50, ErrorMessage = "Максимальная длина пароля - 50 символов")]
        [Display(Name = "Пароль")]
        public string Password { get; set; }
        [Required]
        [Display(Name = "Роль")]
        public int RoleId { get; set; }
        public IEnumerable<SelectListItem> UsrRoles { get; set; }
        public virtual UserRoles UserRoles { get; set; }
    }

此文件是否 public IEnumerable<SelectListItem> UsrRoles { get; set; } 可能是 AutoMapper 失败的原因?

我这样调用映射:

public async Task<IEnumerable<UsersViewModel>> GetUsersList()
        {
            var t = new Task<IEnumerable<Users>>(() => _db.Users.ToEnumerable());
            t.Start();          
            await t;
            var vm = Mapper.Map<Task<IEnumerable<Users>>, Task<IEnumerable<UsersViewModel>>>(t);
            return vm.Result.OrderBy(x => x.Login);
        }

失败是因为您试图将 Task 而不是 Users 映射到 UsersViewModel。你想要:

public async Task<IEnumerable<UsersViewModel>> GetUsersList()
{
  var users = await new Task<IEnumerable<Users>>(() => _db.Users.ToEnumerable());
  var vm = Mapper.Map<IEnumerable<Users>, IEnumerable<UsersViewModel>>(users);
  return vm.Result.OrderBy(x => x.Login);
}

await 将 return 任务的结果,这是您想要的,而不是任务本身。

您的另一个选择是调用 t.Result,这将 return IEnumerable<Users> 列表。

感谢 shf301,我得到了更好的解决方案。你是对的,我试图映射任务而不是 IEnumerable。

     public async Task<IEnumerable<UsersViewModel>> GetUsersList()
        {
            var t = new Task<IEnumerable<Users>>(() => _db.Users.ToEnumerable());
            t.Start();          
            IEnumerable<Users> z = await t;
            var vm = Mapper.Map<IEnumerable<Users>, IEnumerable<UsersViewModel>>(z);
            return vm.OrderBy(x => x.Login);
        }