Операции Read и Update: в чём подвох?
@iksergeyruПредставьте ситуацию: вы пишете приложение и у вас имеется модель данных

В ней содержится много информации, которую хотелось бы скрыть от любопытных глаз, например LastName, Salary, Address или что-то ещё.
Что делать чтобы данные скрыть? Нужно описывать новую DTO-модель (Data Transfer Object), в которой не будет ничего лишнего.

И как следствие нужно писать конвертер, который будет преобразовывать Worker'a в WorkerDto.

Хорошо. Описали. Какие дальнейшие проблемы возникают при внедрении всего этого в своё приложение?
Первая и очевидная – если в приложении сто моделей, значит нужно писать сто конвертеров. Вторая – если в приложении есть логика изменения данных, то нам придётся писать что-то такое:

Выглядит ужасно, но это только пол беды, так как тут не стоят проверки на отсутствие данных. Модель может быть гораздо более сложной и тогда нужно проверять наличие данных и если они есть – менять.

Вспоминаем, что у нас в приложении сотни классов, значит нужно будет делать тысячи if(что-то там ≠ null)... так и выгореть можно, но на радость разработчикам есть библиотеки, выполняющие эту работу за нас – Мапперы.
Установим в свой проект библиотеку
AutoMapper https://automapper.org | https://github.com/AutoMapper
dotnet add package AutoMapper dotnet add package AutoMapper.Extensions.Microsoft.DependencyInjection
Затем нужно сконфигурировать библиотеку. Начать нужно с объекта-наследника Profile для того, чтобы библиотека понимала, что во что нужно "превращать".

"Собрать" экземпляр маппера

и всё готово.
Теперь вместо написания конвертера Листинг 3, достаточно прописать
WorkerDto dto = mapper.Map<WorkerDto>(<worker obj>);
А вместо кода Листинг 5 достаточно этого:
Worker w = db.Find(e => e.Id == id); mapper.Map(<new data>, w);
Согласитесь, это намного ускорит процесс разработки.
🤝 Благодарю за внимание!
Исходники на github - https://github.com/iksergey/Hobby/tree/master/Mapper/CSharp