What could be reason of AutoMapper failed?

136 Views Asked by At

I suppose that reason of AutoMapper failed is slightly different fields of domain model and view model. Here is domain model:

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; }
    }

So here is view model:

 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; }
    }

Is this filed public IEnumerable<SelectListItem> UsrRoles { get; set; } could be reason why AutoMapper failed?

I call mapping this way:

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);
        }
2

There are 2 best solutions below

0
On BEST ANSWER

It's failing because you are trying to map Task's not Users to UsersViewModel. You want:

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 will return the result of the Task, which is what you want, not the task itself.

Your other option would be calling t.Result which would return the IEnumerable<Users> list.

0
On

I got even better solution, thanks to shf301. You was right that I tried to map Task instead of 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);
        }