Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/65: Рейтинг темы: голосов - 65, средняя оценка - 4.97
3 / 3 / 1
Регистрация: 18.02.2021
Сообщений: 70

Как смаппить сущность, имеющую внутри себя вложенный объект?

13.07.2021, 14:12. Показов 13440. Ответов 41

Студворк — интернет-сервис помощи студентам
Всем привет. Подскажите, пожалуйста, как настроить automapper для маппинга ToDoItem в ToDoModel

ToDo:

C#
1
2
3
4
5
6
7
8
9
10
public class ToDoItem
    {
        public int Id  { get; set; }
        public string Name  { get; set; }
        public string Content  { get; set; }
        public bool IsCompleted  { get; set; }
        public int Importance  { get; set; } 
        public User Creator { get; set; }
        public string CreatorId { get; set; }
    }
ToDoModel:

C#
1
2
3
4
5
6
7
8
9
10
 public class ToDoModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Content { get; set; }
        public bool IsCompleted { get; set; }
        public int Importance { get; set; }
        public UserModel Creator { get; set; }
        public string CreatorId { get; set; }
    }
Как я понимаю, исключение вызывает маппинг вложенных объектов User и UserModel. Как этого избежать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.07.2021, 14:12
Ответы с готовыми решениями:

Смаппить сущность в Dictionary используя AutoMapper
Блин, извините за глупый вопрос, но все же. Подскажите пожалуйста, как сущность смаппить в Dictionary спомощью AutoMapper? Мне нужно...

Прочитать вложенный объект внутри Json
При запросе отправляю объект Data: public class Data { public Data() => NestedData = new NestedData(); ...

API. Как десериализовать вложенный объект?
Есть тестовый API JSON http://jsonplaceholder.typicode.com/posts Через Visual Studio конвертировал JSON в объекты C#, которые имеют...

41
Эксперт .NET
 Аватар для Usaga
14749 / 9524 / 1364
Регистрация: 21.01.2016
Сообщений: 35,936
30.08.2021, 07:33
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от JustAnAnimal Посмотреть сообщение
то просто кретинизм обсирать сверхпопулярный иструмент(достаточно глянуть гугл трендс) и уверять, что он не нужен.
Кретинизм - это слепо верить гугл трендсам. У меня есть реальный опыт использования автомапера. Этим опытом я и поделился. Но да, десятки тысяч новичков, что взяли автомапер моды ради, тут правее человека пять лет с автомапером проработавшего)

Добавлено через 1 минуту
Цитата Сообщение от JustAnAnimal Посмотреть сообщение
Обычно все ведут себя адекватно.
А кто тут неадекватно себя повёл? Был диалог, где люди обсуждали автомапер. Ваша проблема из разряда X-Y. Вы, почему-то, решили, что вам нужен автомапер. Я попытался донести, что автомапер вам вообще не нужен. Соответственно, нет той проблемы, о которой вы тут спросили.
0
198 / 93 / 43
Регистрация: 09.11.2019
Сообщений: 414
30.08.2021, 20:43
Цитата Сообщение от Usaga Посмотреть сообщение
А кто тут неадекватно себя повёл?
А это камень в мой огород, мне кажется
0
Эксперт .NET
 Аватар для Usaga
14749 / 9524 / 1364
Регистрация: 21.01.2016
Сообщений: 35,936
31.08.2021, 10:46
__Corey, ну не знаю) Вроде бы все себя вели культурно и обсуждение шло более-менее конструктивно)
0
3 / 3 / 1
Регистрация: 18.02.2021
Сообщений: 70
04.09.2021, 14:54  [ТС]
Usaga, вы уже вмешались в существующее обсуждение и не провоцировали его возникновение, так что мой наезд был большей частью необоснованный, за что я извиняюсь. А вот nikolas2008 реально полез не туда. Это просто флуд, о котором я не просил. Если с маппером будут проблемы, я сам до них дойду и,соответственно, буду принимать меры. Пока я встречаю его везде: и в книгах, и на бесплатной стажировке, и на работе. То есть знать, как с ним обращаться мне надо, это просто необходимо.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
04.09.2021, 15:10
JustAnAnimal, если хотите учится на своих ошибках, а тем более игнорировать конструктивную критику ваше право. Не буду больше вам мешать наступать на грабли, извините.
0
Эксперт .NET
 Аватар для Usaga
14749 / 9524 / 1364
Регистрация: 21.01.2016
Сообщений: 35,936
05.09.2021, 07:59
JustAnAnimal, я тоже его везде встречаю. Как и Entity Framework. Но это мода, как джинсы подвёрнутые, а не полезная на практике вещь.

Касательно вопроса. Вы можете руками описать мапинг в автомапере, простой лямбдой или вызовом внешнего статического хелпера. Так вы и процесс проецирования в своих руках сохраните, на чём я настаиваю, и "необходимость" использования автомапера не нарушите. И коллегам вам объективно предъявить будет нечего.

Мы таким путём пошли на работе прежде, чем дошло, что автомапер нам в этом процессе и не нужен, получается.
0
HF
 Аватар для HF
1340 / 924 / 202
Регистрация: 09.09.2011
Сообщений: 2,748
Записей в блоге: 2
05.09.2021, 15:50
Цитата Сообщение от Usaga Посмотреть сообщение
Мы таким путём пошли на работе прежде, чем дошло, что автомапер нам в этом процессе и не нужен, получается.
О! я вспомнил одну из причин хорошести Автомаппера - при обновлении структуры модели не нужно париться за обновление "ручных" мапперов (вдруг их больше одного).
На всякий случай объясню примером - мы добавили новые свойства. Это значит надо найти все мапперы которые используют это свойство. А если этого не сделать то например в ДТО модели будет нулл или пустая коллекция. "Ой", же, разве нет? Как вы такую ситуацию решаете? Разумеется пример применим для энтерпрайз приложений много данных.
Если скажете - "Ну ищем все использования и обновляем", то сразу вопрос - какой шанс не заметить то что делается не так очевидно, например через генерики, рефлексии и т.п. ?
Автомаппер то и решает проблему "ленивых". Он действительно сделает за вас. И в том и другом есть неудобные моменты поддержки.
1
HF
 Аватар для HF
1340 / 924 / 202
Регистрация: 09.09.2011
Сообщений: 2,748
Записей в блоге: 2
22.12.2021, 16:49
Случайно наткнулся на статью и сразу вспомнил эту тему. Не смог не рассказать.
Automapper vs Explicit Conversion
И больше всего меня поразили именно тесты. Результаты немного шокировали, даже не верится. Так ли это?

А почему я вообще на такую страницу наткнулся? А потому что узнал ещё один вариант "маппинга" - через implicit/explicit. И мне стало интересно, что умные люди говорят. Теоритически это должно быть точной копией обычного самописанного трансформера. Но вот разница в месте размещения и инициализации разная. "Вдруг есть есть ньюансы", - подумал я и пошёл гуглить. А нашёл статью.
Заодно вопрос - кто-то делает "маппинг" через приведение типов?
0
Эксперт .NET
 Аватар для Usaga
14749 / 9524 / 1364
Регистрация: 21.01.2016
Сообщений: 35,936
23.12.2021, 07:00
Цитата Сообщение от HF Посмотреть сообщение
"Ой", же, разве нет? Как вы такую ситуацию решаете?
Элементарно решаем. Тестируем. Т.е. ещё до QA, врамках простой проверки фичи. Очень сложно не заметить, что новое поле\свойство не появляется там, где должно. В моей практике это работает. И работает совершенно хорошо.

Цитата Сообщение от HF Посмотреть сообщение
Заодно вопрос - кто-то делает "маппинг" через приведение типов?
Я несколько раз делал, но потом перестал. Вроде писанины меньше (в месте "мапирования"), но это настолько неявно получается, что прямо атас. С автомапером хотя бы видно, что тут идёт проецирование. А с приведением неявным даже этого не видно. Так точно делать не стоит.
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
23.12.2021, 15:02
Цитата Сообщение от HF Посмотреть сообщение
А потому что узнал ещё один вариант "маппинга" - через implicit/explicit. И мне стало интересно
Для implicit увеличение вероятности багов из-за ошибок при присвоении переменным.
Можно неочевидно создать клоны и при этом не осознавать, что это разные экземпляры.

Для explicit - он просто не даёт никаких преимуществ в сравнении с методом.
Но как-то понятнее, привычнее использовать для создания других экземпляров метод, а (тип) использовать для присвоения ссылки на объект разным типам переменным, без клонирования самого объекта.

Цитата Сообщение от HF Посмотреть сообщение
Результаты немного шокировали, даже не верится.
Моих знаний тоже не хватает для понимания такого результата.
Что бросилось в глаза это создание новых строк и парсинг в Explicit Conversion.
Надо загрузить исходники теста с Гита, посмотреть их и повторить тест.
Если будет на это время когда-нибудь...
0
HF
 Аватар для HF
1340 / 924 / 202
Регистрация: 09.09.2011
Сообщений: 2,748
Записей в блоге: 2
23.12.2021, 16:00
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что бросилось в глаза это создание новых строк и парсинг в Explicit Conversion.
Надо загрузить исходники теста с Гита, посмотреть их и повторить тест.
Если будет на это время когда-нибудь...
Я тоже сначала решил проект глянуть, а оказалось что это вообще другой проект. А эти тесты "использовались при создании этого проекта". Я понял так. То есть взять и потестить не получится. Нужно взять и написать аналогичные тесы по примеру.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для explicit - он просто не даёт никаких преимуществ в сравнении с методом.
Разница есть. Это ещё большая "прозрачность" при конверсии. Но вот преимущество это или нет - это как раз скорее относится к личным предпочтениям.
Боюсь раздуть философскую дискуссию. Но разве нововведния в новых версиях C# всё больше и больше не "засахаривают" разработку? Не уменьшают количество написанного кода? Не делают логику исполнения более "прозрачной" для программиста.
Я бы сравнил explicit конверсию с нововведнием - создание объекта без указания типа. Ну знаете ли, тоже настолько неочевидное и прозрачное действие, что без IDE (просмотр файла в Git например) вы сразу то и не поймёте что там будет за итог. Я против повсеместных "var", а сейчас ещё и типизацию убрали. Что мы получили: "var variable = new(item);". Ну зашибись, облегчили работу жёсткого диска в ущерб очевидности и пониманию.
Я к чему. Если целью является написание кода который выполняет задачу, то explicit очень неплохо вписывается сюда. При продуманной архитектуре, тестах и т.п. он даёт тот же эффект, но меньшее количество кода в местах трансформации.
Разве нет?

А вообще, я против неочевидностей, сахарозы и уменьшению кода.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
23.12.2021, 16:50
Цитата Сообщение от HF Посмотреть сообщение
Боюсь раздуть философскую дискуссию.
Я вот думаю всё разделить данную тему, так как уже ушли от первоначального вопроса.
Но посты (вопросы и ответы) очень запутаны.

Цитата Сообщение от HF Посмотреть сообщение
А вообще, я против неочевидностей, сахарозы и уменьшению кода.
Здесь дело не в сахаре.

А в том что от оператора явного приведения ожидаешь иного поведения.

Пример, типового ожидаемого поведения:
C#
1
2
3
object obj = new MyClass();
OtherType other = (OtherType) obj;
var equals = ReferenceEquals(obj, other); // True
Если же прописать маппинг в explicit, то это будет создание нового экземпляра.
И получаем весьма неочевидное:
C#
3
var equals = ReferenceEquals(obj, other); // False
И даже более:
C#
1
2
3
OtherType other1 = (OtherType) obj;
OtherType other2 = (OtherType) obj;
var equals = ReferenceEquals(other1, other2); // False
Добавлено через 3 минуты
Такое поведение является нормой для значимых типов, но для ссылочных, на мой взгляд, это может привести к путанице и трудноуловимым багам.
0
Эксперт .NET
 Аватар для Usaga
14749 / 9524 / 1364
Регистрация: 21.01.2016
Сообщений: 35,936
23.12.2021, 16:51
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для explicit - он просто не даёт никаких преимуществ в сравнении с методом.
Более того: это решение засирает код класса ненужной для него обязанностью. Ещё более того: не любой мапинг так вообще возможно сделать. Может потребоваться обращение к внешним statefull-сервисам. Или разные сценарии мапинга между двумя сущностями.

Цитата Сообщение от HF Посмотреть сообщение
Разница есть. Это ещё большая "прозрачность" при конверсии.
Эм. Нет. Тут не "прозрачность", тут - неочевидность.

Цитата Сообщение от HF Посмотреть сообщение
Но разве нововведния в новых версиях C# всё больше и больше не "засахаривают" разработку? Не уменьшают количество написанного кода?
Уменьшают, но не делают её волшебной и неочевидной.

Цитата Сообщение от HF Посмотреть сообщение
Я против повсеместных "var"
Почему?

Цитата Сообщение от HF Посмотреть сообщение
Что мы получили: "var variable = new(item);"
Такой код не соберётся. Тип вывести неоткуда.

Цитата Сообщение от HF Посмотреть сообщение
Если целью является написание кода который выполняет задачу, то explicit очень неплохо вписывается сюда. При продуманной архитектуре, тестах и т.п. он даёт тот же эффект, но меньшее количество кода в местах трансформации.
Разве нет?
С одной стороны речь о том, что это хорошо вписывается в код. С другой - о продуманной архитектуре, которая однозначно против размещения кода проекцирования в сущностях. Это противоречивые тезисы.

Цитата Сообщение от HF Посмотреть сообщение
А вообще, я против неочевидностей, сахарозы и уменьшению кода.
Опять же, "сахар" и "уменьшение кода" не значит вред для очевидности.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
23.12.2021, 16:57
Usaga, что скажете по тесту из статьи:
Цитата Сообщение от HF Посмотреть сообщение
Случайно наткнулся на статью и сразу вспомнил эту тему. Не смог не рассказать.
Automapper vs Explicit Conversion
И больше всего меня поразили именно тесты. Результаты немного шокировали, даже не верится. Так ли это?
0
Эксперт .NET
 Аватар для Usaga
14749 / 9524 / 1364
Регистрация: 21.01.2016
Сообщений: 35,936
23.12.2021, 17:39
Элд Хасп, какой-то хреновый тест. Вы видели, ЧТО там сравнивается?) Основной посыл: Automapper не то, что не хуже, он даже немного быстрее. Но там автор упустил один момент, который и сказался на разнице в производительности. Угадаете, какой?)

Добавлено через 6 минут
Вообще, можно сходу уже предположить, что происходит что-то не то в тесте, ибо автомапер один чёрт генерирует код, который равен тому, что написан руками. Т.е. должен быть максимум паритет, за вычетом первоначального штрафа на генерацию. Но уж никак не преимущество.
0
HF
 Аватар для HF
1340 / 924 / 202
Регистрация: 09.09.2011
Сообщений: 2,748
Записей в блоге: 2
23.12.2021, 17:44
Цитата Сообщение от Usaga Посмотреть сообщение
Такой код не соберётся. Тип вывести неоткуда.
Конечно есть откуда. Вы в IDE то весь код можете посмотреть или мышкой навести на "item". Да, согласен, поторопился я с примером. Накидал быстрый пример о чём я хотел сказать.
C#
1
2
3
4
5
6
7
8
9
    MyClass item1 = null;
 
// пример 1
.... тут десяток строк или вообще другие классы
    item1 = new();
 
// пример 2
.... тут десяток строк или вообще другие классы
    var list = new[] { item1 };
где в строке инициализации - без IDE никогда не поймёшь что там вообще будет.

Добавлено через 2 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Вообще, можно сходу уже предположить, что происходит что-то не то в тесте, ибо автомапер один чёрт генерирует код, который равен тому, что написан руками. Т.е. должен быть максимум паритет, за вычетом первоначального штрафа на генерацию. Но уж никак не преимущество.
Именно это меня и сильно удивило и заинтересовало. Но скорее я поверю в то что или "есть ньюанс", или тестировалось неверно. О каком моменте вы намекали?
0
Эксперт .NET
 Аватар для Usaga
14749 / 9524 / 1364
Регистрация: 21.01.2016
Сообщений: 35,936
23.12.2021, 17:45
HF, мой докапон был именно к вашему фрагменту кода) Понятно, что вы там ошиблись)

Но смотрите какое дело: я последние лет пять или шесть постоянно использую var и для меня (и моих коллег, которые ревьювят мой код) это не вызывает когнитивной нагрузки. Т.е. сидя в TortoiseHG не возникает необходимости запустить IDE и посмотреть какой же там реально тип. И просто при просмотре кода в IDE тоже.

Т.е. проблема явно надуманная. В большинстве случаев, вам и не интересно знать какой там тип откуда прилетел и куда полетел.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
23.12.2021, 17:45
Цитата Сообщение от Usaga Посмотреть сообщение
Но там автор упустил один момент, который и сказался на разнице в производительности. Угадаете, какой?)
Ну, я сразу написал:
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что бросилось в глаза это создание новых строк и парсинг в Explicit Conversion.
AutoMapper не использую.
Поэтому возможно упускаю ещё что-то.
На уровне моих знаний, он работает через рефлексию и ни при каких условиях в равных задачах не может быстрее.
0
Эксперт .NET
 Аватар для Usaga
14749 / 9524 / 1364
Регистрация: 21.01.2016
Сообщений: 35,936
23.12.2021, 17:49
Цитата Сообщение от HF Посмотреть сообщение
О каком моменте вы намекали?
Посмотрите на ручной маппинг и подумайте, как Automapper заполняет свойство FullName. Отвечу: никак. Он не знает как и пропускает (оно не подпадает под соглашение). Поэтому профиль автомапера и быстрее. Если после конфигурирования автомапера вызвать AssertConfigurationIsValid();, то вы получите исключение, где автомапер скажет, что не знает как смапить это свойство.

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
AutoMapper не использую.
Поэтому возможно упускаю ещё что-то.
На уровне моих знаний, он работает через рефлексию и ни при каких условиях в равных задачах не может быстрее.
Вы ничего не упускаете. Автомапер использует рефлексию, но только при первом мапинге. Когда ему нужно сгенерировать мапперы. После этого производительность строго та же, что у вручную написанного кода. Плюс-минус. Проблемы автомапера не в производительности мапинга.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
23.12.2021, 17:51
Цитата Сообщение от Usaga Посмотреть сообщение
как Automapper заполняет свойство FullName
Я это и имел ввиду.
И мне ещё не нравится преобразование в строку и обратно для свойства Id.
Как-то уж очень подозрительно выглядит.
Поэтому и хотел посмотреть исходники (которых как оказалось нет).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.12.2021, 17:51

Как разобрать вложенный объект в цикле
Всем привет! Никак не могу дотянуться до элемента в объекте: var array_x = { 1: {'a': 'b'}, 2: {'c': 'd'}, ...

Как работать с массивом в котором есть объект и вложенный массив?
let user = , { name:'abc', cost:'5', numbers:, count:{ props:4, area:7 } }]

Как записать вложенный оператор If внутри другого оператора If, чтобы добиться нужного эффекта?
Добрый день, подскажите пожалуйста почему не правильно отрабатывает макрос? Суть задачи, есть ячейки вида 7 3 Ане _ 4 Саше ...

Терминология: Класс, объект, экземпляр, сущность. (Дейт о путанице в этой сфере)
О некоторых проблемах терминологии, которые ещё и осложняются тем, что термины кочуют по смежным областям знания (и окончательно...

Как настроить форму обратной связи под себя? (файлы внутри)
Взял одностраничник и хочу настроить форму чтобы сообщения приходили на мою почту... где нужно указывать свою почту? index.txt - html...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru