Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1

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

17.11.2016, 11:11. Показов 4817. Ответов 8

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане.

Сразу перейду к делу - через nuget поставил Automapper и попытался настроить мэппинг.

Мои модели
C#
1
2
3
4
5
6
7
8
9
10
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; }
}
C#
1
2
3
4
public class ApplicationUser : IdentityUser
{
    public virtual UserInfo UserInfo { get; set; }
}
C#
1
2
3
4
5
6
7
8
9
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 с заполненными данными.

При мэппинге получаю ошибку
Code
1
2
3
4
5
"Error mapping types. 
Mapping types: 
RegisterViewModel -> ApplicationUser 
Type Map configuration: RegisterViewModel -> ApplicationUser 
Property: UserInfo"
Правила
Пробовал вот так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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));
        }
        );
И вот так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
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-й вариант правил.

Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.11.2016, 11:11
Ответы с готовыми решениями:

Ошибка при использовании нескольких переменных с одним именем в разных уровнях вложенности циклов for
Почему когда создаешь цикл фор по 2 раза и больше раз,и объявляешь там одну и ту же переменную(с одним названием),то не выдаёт ошибку?

Как вызвать ошибку при несовпадении сопоставляемых свойств при AutoMapper?
Как сделать, чтобы при сопоставлении свойств при AutoMapper возникала ошибка при несовпадении типов? Есть два класса: public...

При мапинге automapper-ом many-to-many releation делает множество заявок к базе вместо одной
Добрый день уважаемые форумчане, Подскажите пожалуйста, вот такой вопрос. Я использую automapper для мапинга моделей. Проблема том...

8
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
17.11.2016, 13:37
В аттаче проект консольный

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
namespace Mapping
{
    using System;
    using System.Linq;
    using AutoMapper;
    using StructureMap;
 
    internal class Program
    {
        private static void Main()
        {
            IoC.Container.Configure(cfg => { cfg.AddRegistry(new AutoMapperRegistry()); });
 
            using (var container = IoC.Container.GetNestedContainer())
            {
                var registerViewModel = new RegisterViewModel
                {
                    Email = "Test@mail.com",
                    Login = "Login",
                    Password = "pwd",
                    ConfirmPassword = "pwd",
                    FirstName = "Kos",
                    LastName = "Kos",
                    BirthDay = DateTime.UtcNow
                };
 
                var config = container.GetInstance<MapperConfiguration>();
 
                var mapper = config.CreateMapper();
 
                var model = mapper.Map<ApplicationUser>(registerViewModel);
            }
        }
    }
 
    public class AutoMapperRegistry : Registry
    {
        public AutoMapperRegistry()
        {
            var profiles =
                typeof(AutoMapperRegistry).Assembly.GetTypes()
                    .Where(t => typeof(Profile).IsAssignableFrom(t))
                    .Select(t => (Profile) Activator.CreateInstance(t));
 
            var config = new MapperConfiguration(cfg =>
            {
                foreach (var profile in profiles)
                {
                    cfg.AddProfile(profile);
                }
            });
 
            For<MapperConfiguration>().Use(config);
            For<IMapper>().Use(ctx => ctx.GetInstance<MapperConfiguration>().CreateMapper(ctx.GetInstance));
        }
    }
 
    public class MappingProfile : Profile
    {
        public MappingProfile()
        {
            CreateMap<RegisterViewModel, UserInfo>();
 
            CreateMap<RegisterViewModel, ApplicationUser>()
                .ForMember(dest => dest.UserInfo,
                    opt => opt.MapFrom(src => src));
        }
    }
 
    public static class IoC
    {
        static IoC()
        {
            Container = new Container();
        }
 
        public static IContainer Container { get; set; }
    }
 
    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; }
    }
}
Вложения
Тип файла: zip Mapping.zip (9.9 Кб, 3 просмотров)
1
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
17.11.2016, 20:13  [ТС]
_exp10der_, Спасибо.

К сожалению с инверсией не знаком должным образом. Не могли бы вы объяснить зачем делается эти ужасные (на мой взгляд) действия?

И обязательно ли такое сотворять дабы выполнить простой маппинг по правилу?
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
17.11.2016, 21:09
Лучший ответ Сообщение было отмечено bodynar как решение

Решение

bodynar, Нет конечно. Обычно с EF6 + DelegateDecompiler + AutoMapper.
Инверсию например юзают что бы оркестрировать одним DbContex'том в разных классах и для неявной транзакцией например в ASP.NET MVC часто применяют такую технику.
Прост поменял свой старый ответ под ваши классы Automapper и List<T>

Ниже пример только AutoMapper использую
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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
            };
 
            var config = new MapperConfiguration(cfg => { cfg.AddProfile(new MappingProfile()); });
 
            var mapper = config.CreateMapper();
 
 
            var model = mapper.Map<ApplicationUser>(registerViewModel);
        }
    }
 
    public class MappingProfile : Profile
    {
        public MappingProfile()
        {
            CreateMap<RegisterViewModel, UserInfo>();
 
            CreateMap<RegisterViewModel, ApplicationUser>()
                .ForMember(dest => dest.UserInfo,
                    opt => opt.MapFrom(src => src));
        }
    }
 
    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; }
    }
}
1
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
18.11.2016, 17:20  [ТС]
_exp10der_, Спасибо большое.

Только вот не могу понять.

В моем случае я пытался использовать статичный маппер и задавать ему правила (верно?) и почему-то он не работал.

В вашем же случае вы конфигурируете конкретный мапппер аналогичными правилами и все работает.

Не могли бы вы объяснить почему такое алоэ случается?
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
19.11.2016, 14:51
Лучший ответ Сообщение было отмечено bodynar как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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; }
    }
}
1
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
19.11.2016, 17:17  [ТС]
_exp10der_, Опять-таки спасибо.

Если честно - пробовал также точь-в-точь и получал ошибку, что в первом сообщении.
Магия какая-то.
0
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
20.11.2016, 00:47  [ТС]
_exp10der_, видимо вы волшебник.

Столкнулся опять с проблемой и взываю к вашей помощи.

Модели особо не изменились (если только названиями и количеством полей).

Правила
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
cfg.CreateMap<EmployeeViewModel, Employee>()
                   .ForMember(dest => dest.ManInfo, e => e.MapFrom(src => src))
                   .ReverseMap();
 
                    cfg.CreateMap<EmployeeViewModel, ManInfo>()
                    .ReverseMap();


И моя попытка
C#
1
var vm = Mapper.Map<EmployeeViewModel>(emp); // emp.GetType() = Employee
В итоге получаю, что все поля из Employee.ManInfo занулены, остальное прошло (пикрелейтед)
Миниатюры
AutoMapper, Ошибка при вложенности  
0
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
20.11.2016, 01:00  [ТС]
Небольшая поправка
Вот полный список правил
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cfg.CreateMap<EmployeeViewModel, ManInfo>()
                    .ReverseMap();
 
                    cfg.CreateMap<EmployeeViewModel, Organization>()
                    .ForMember(dest => dest.Id, e => e.MapFrom(src => src.OrganizationId))
                    .ReverseMap();
 
                    cfg.CreateMap<EmployeeViewModel, Departament>()
                    .ForMember(dest => dest.Id, e => e.MapFrom(src => src.DepartamentId))
                    .ForMember(dest => dest.Organization, e => e.MapFrom(src => src))
                    .ReverseMap();
 
                    cfg.CreateMap<EmployeeViewModel, Employee>()
                    .ForMember(dest => dest.ManInfo, e => e.MapFrom(src => src))
                    .ForMember(dest => dest.Departament, e => e.MapFrom(src => src))
                    .ReverseMap();
Но, к сожалению, также работает не все.
Мне необходимо данную строку
C#
1
vm.OrganizationId = emp.Departament.Organization.Id.ToString(); // vm is EmployeeViewModel
заменить с помощью мэппера.

Попробовал по аналогии, как вы показали - к сожалению не достиг желаемого результата.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.11.2016, 01:00
Помогаю со студенческими работами здесь

Ошибка вложенности
Функция проходит по массиву и, если в нём есть элементы 'w', создаёт внутри блока с заданным id красные прямоугольники с надписью...

Массив: Превратить заданный массив с несколькими уровнями вложенности в массив с одним уровнем вложенности.
Добрый день. Необходимо выполнить задание: Дано массив: , ], ]. Написать программу, которая превратит заданный массив с...

Automapper many to one
Добрый день. Пишу проект на asp.net mvc 5. И часто возникают ситуации когда захожу в тупик, а подсказать не кому, нужен наставник для того...

Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка записи!
Доброго всем времени суток! подскажи пожалуйста как исправить ошибку: Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове...

Update EF и Automapper
Всем доброго времени суток. При использовании Automapper столкнулся с проблемой обновления сущности. Вот пример кода. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru