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);
}
我认为 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);
}