AutoMapper, Ошибка при вложенности - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Сразу перейду к делу - через nuget поставил Automapper и попытался настроить мэппинг.
public class RegisterViewModel
{
    public string Email { get; set; }
    public string Login { get; set; }
    public string Password { get; set; }
    public string ConfirmPassword { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime? BirthDay { get; set; }
}public class ApplicationUser : IdentityUser
{
    public virtual UserInfo UserInfo { get; set; }
}public class UserInfo
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime RegisterDate { get; set; }
    public DateTime BirthDay { get; set; }
    public string MiddleName { get; set; }
}
Необходимо произвести мэппинг из RegisterViewModel -> ApplicationUser таким образом, чтобы была сформирована модель

ApplicationUser

, у которой имелось свойство типа

UserInfo

с заполненными данными. При мэппинге получаю ошибку
"Error mapping types. 
Mapping types: 
RegisterViewModel -> ApplicationUser 
Type Map configuration: RegisterViewModel -> ApplicationUser 
Property: UserInfo"
Mapper.Initialize(init =>
        {
            init.CreateMap<RegisterViewModel, ApplicationUser>()
            .ForMember(dest => dest.UserInfo, e => e.MapFrom(scr => scr))
            .ForMember(dest => dest.UserName, e => e.MapFrom(src => src.Login))
            .ForMember(dest => dest.Email, e => e.MapFrom(src => src.Email));
 
            init.CreateMap<RegisterViewModel, UserInfo>()
           .ForMember(dest => dest.FirstName, e => e.MapFrom(src => string.IsNullOrEmpty(src.FirstName) ? "Not stated" : src.FirstName))
           .ForMember(dest => dest.BirthDay, e => e.MapFrom(src => (DateTime)src.BirthDay))
           .ForMember(dest => dest.LastName, e => e.MapFrom(src => string.IsNullOrEmpty(src.LastName) ? "Not stated" : src.LastName))
           .ForMember(dest => dest.RegisterDate, e => e.MapFrom(src => DateTime.Now.Date));
        }
        );Mapper.Initialize(init =>
            {
                init.CreateMap<RegisterViewModel, ApplicationUser>()
                .ForMember(dest => dest.UserInfo, e => e.MapFrom(src => new UserInfo() {
                    BirthDay = (DateTime)src.BirthDay,
                    FirstName = string.IsNullOrEmpty(src.FirstName) ? "Not stated" : src.FirstName,
                    LastName = string.IsNullOrEmpty(src.LastName) ? "Not stated" : src.LastName,
                    RegisterDate = DateTime.Now.Date
                }))
                .ForMember(dest => dest.UserName, e => e.MapFrom(src => src.Login))
                .ForMember(dest => dest.Email, e => e.MapFrom(src => src.Email));
            }
            );
В итоге в обоих случаях получаю одну и ту же ошибку - что не настроено правило мэпа для свойства

UserInfo

. Подскажите, пожалуйста, в чем я ошибся или как правильно настроить мэппинг при таких моделях? На англостэке находил подобный вариант и там описывался 1-й вариант правил. Спасибо.

Решение задачи: «AutoMapper, Ошибка при вложенности»

textual
Листинг программы
namespace Mapping
{
    using System;
    using AutoMapper;
 
    internal class Program
    {
        private static void Main()
        {
            var registerViewModel = new RegisterViewModel
            {
                Email = "Test@mail.com",
                Login = "Login",
                Password = "pwd",
                ConfirmPassword = "pwd",
                FirstName = "Kos",
                LastName = "Kos",
                BirthDay = DateTime.UtcNow
            };
 
            Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<RegisterViewModel, UserInfo>();
 
                cfg.CreateMap<RegisterViewModel, ApplicationUser>()
                    .ForMember(dest => dest.UserInfo,
                        opt => opt.MapFrom(src => src));
            });
 
            var model = Mapper.Map<ApplicationUser>(registerViewModel);
        }
    }
 
 
    public class RegisterViewModel
    {
        public string Email { get; set; }
        public string Login { get; set; }
        public string Password { get; set; }
        public string ConfirmPassword { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime? BirthDay { get; set; }
    }
 
    public class ApplicationUser
    {
        public virtual UserInfo UserInfo { get; set; }
    }
 
    public class UserInfo
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime RegisterDate { get; set; }
        public DateTime BirthDay { get; set; }
        public string MiddleName { get; set; }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.308 из 5
Похожие ответы