powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / AutoMapper + EF Core преобразование сущности-DTO в просто сущность
14 сообщений из 14, страница 1 из 1
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881077
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет у меня есть сущность, которая используется в контексте данных

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
   public class Entity
    {
        public int ID { get; set; }
        public string  Name{ get; set; }
        public PropertyClass PropertyClass { get; set; }
    }

 public class PropertyClass
    {
        public int ID { get; set; }
        public string PropertyName {get; set; }

        ///много других свойств
    }



Есть также "облегченный" DTO-вариант этой сущности, которая используется для внешнего обмена из сервиса
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
   public class EntityDto
    {
        public int ID { get; set; }
        public string Name { get; set; }

        //идентификаторы PropertyClass 
        public int PropertyClassID   { get; set; }
    }



Соответственно у меня возникает вопрос конвертации при добавлении/редактировании экземпляров класса Entity=>EntityDto и наоборот.

///mapper
Код: c#
1.
2.
3.
4.
       CreateMap<EntityDto,Entity>()
                .ForMember(d=>d.PropertyClass,
                options=>options.MapFrom(source=>
                new PropertyClass { ID=source.ID}));



Когда приходит DtoEntity-я могу ее смапить в Entity c таким же ID. К сожалению это не подходит, потому что, чтобы сделать добавление в базу данных новую Entity, её необходимо сначала оттуда загрузить.
В принципе я нашел способ, как в маппер инжектить dbContext и загружать сущности прямо из маппинга, но ввиду того, что в интернетах описание такой практики отсутствует+жесткое смешивание ответственностей, считаю такой способ реализации нежелательным.
Второй вариант -это уже непосредственная сборка всей сущности(подгрузка связанных объектов по их ID) в контроллере или сервисе, что тоже плохо- потому что половина конвертации сущности из DtoEntity в Entity делается маппером, половина в другом месте- тоже погано получается.
Возможно есть способ подсунуть EF Core только ID связанной сущности, а не подгружать её сначала, или как лучше организовать переход из DTO-объекта в объект, годный для сохранения в датаконтексте. Спасибо.
...
Рейтинг: 0 / 0
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881138
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, используй Attach:
Код: c#
1.
2.
3.
4.
var entity = _mapper.Map<EntityDto, Entity>();
_dbContext.Attach(entity.PropertyClass);
_dbContext.Entities.Add(entity);
await dbContext.SaveChangesAsync();


Но, лично я, скорее всего, все-таки, эту сущность (PropertyClass) загружал бы, если против этого нет веских причин (например, в виде критического по производительности куска кода). Потому что если снаружи придет направильный ID, то отловить и обработать нарушение FK в базе это будет намного тяжелее, чем проверить после загрузки значение на null.
...
Рейтинг: 0 / 0
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881140
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subК сожалению это не подходит, потому что, чтобы сделать добавление в базу данных новую Entity, её необходимо сначала оттуда загрузить.Необязательно, в общем-то. Можно присоединить к контексту.
...
Рейтинг: 0 / 0
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881143
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AutoMapper какашко .
Если лень набивать вручную код маппинга, его можно генерировать .
...
Рейтинг: 0 / 0
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881148
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikAutoMapper какашко .
Если лень набивать вручную код маппинга, его можно генерировать .
Так и что вы предлагаете генерировать-то?
Подгрузку связанных объектов по их ID? Внутри маппера?
...
Рейтинг: 0 / 0
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881149
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikAutoMapper какашко .
Если лень набивать вручную код маппинга, его можно генерировать .
Бред.
...
Рейтинг: 0 / 0
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881269
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subК сожалению это не подходит, потому что, чтобы сделать добавление в базу данных новую Entity, её необходимо сначала оттуда загрузить.

Это неправда. Чтобы добавить новую Entity вы можете добавить свой экземпляр Entity в контектс, ничего не нужно загружать.


vb_subВторой вариант -это уже непосредственная сборка всей сущности(подгрузка связанных объектов по их ID) в контроллере или сервисе, что тоже плохо- потому что половина конвертации сущности из DtoEntity в Entity делается маппером, половина в другом месте- тоже погано получается.

Не второй, а правильный вариант, инкапсулировать работу с Entity в слое бизнес-логики. И полностью полагаться на какие-то мапперы для внесения изменений -- идея плохая.


vb_subВозможно есть способ подсунуть EF Core только ID связанной сущности, а не подгружать её сначала, или как лучше организовать переход из DTO-объекта в объект, годный для сохранения в датаконтексте. Спасибо.

Можно подсунуть ID связанной сущности, но это противоречит подходу EF, вы должны достать сущность и затем присоединить. Таким образом 1) гарантируется наличие связанной записи на уровне приложения 2) объект связанной сущности часто представляет часть агрегата и должен участвовать в процессе валидации на уровне приложения.
...
Рейтинг: 0 / 0
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881270
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatpetalvikAutoMapper какашко .
Если лень набивать вручную код маппинга, его можно генерировать .
Бред.

фигня какая-то. AutoMapper умеет создавать весь маппинг автоматически. также есть динамический маппинг. в общем, эти погони за производительностью в случае маппинга напоминает больше борьбу с ветряными мельницами.
...
Рейтинг: 0 / 0
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881280
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМожно подсунуть ID связанной сущности, но это противоречит подходу EF, вы должны достать сущность и затем присоединить. Таким образом 1) гарантируется наличие связанной записи на уровне приложения 2) объект связанной сущности часто представляет часть агрегата и должен участвовать в процессе валидации на уровне приложения.
Плюсую. Я выше о том же.

hVosttAutoMapper умеет создавать весь маппинг автоматически. также есть динамический маппинг. в общем, эти погони за производительностью в случае маппинга напоминает больше борьбу с ветряными мельницами.
Он компилирует меппинги (по умолчанию при первом вызове Map(), но можно сделать это и руками заранее), а потом уже использует откомпиленный код. Никакого рефлекшена там внутри нет.
...
Рейтинг: 0 / 0
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881359
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttvb_subК сожалению это не подходит, потому что, чтобы сделать добавление в базу данных новую Entity, её необходимо сначала оттуда загрузить.

Это неправда. Чтобы добавить новую Entity вы можете добавить свой экземпляр Entity в контектс, ничего не нужно загружать.


vb_subВторой вариант -это уже непосредственная сборка всей сущности(подгрузка связанных объектов по их ID) в контроллере или сервисе, что тоже плохо- потому что половина конвертации сущности из DtoEntity в Entity делается маппером, половина в другом месте- тоже погано получается.

Не второй, а правильный вариант, инкапсулировать работу с Entity в слое бизнес-логики. И полностью полагаться на какие-то мапперы для внесения изменений -- идея плохая.


vb_subВозможно есть способ подсунуть EF Core только ID связанной сущности, а не подгружать её сначала, или как лучше организовать переход из DTO-объекта в объект, годный для сохранения в датаконтексте. Спасибо.

Можно подсунуть ID связанной сущности, но это противоречит подходу EF, вы должны достать сущность и затем присоединить. Таким образом 1) гарантируется наличие связанной записи на уровне приложения 2) объект связанной сущности часто представляет часть агрегата и должен участвовать в процессе валидации на уровне приложения.

Получается мне в слой бизнес логики(контроллер=> сервис, который работает с датаконтекстом) нужно принимать DTO объект и там его уже преобразовывать в сущность?
...
Рейтинг: 0 / 0
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881365
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subПолучается мне в слой бизнес логики(контроллер=> сервис, который работает с датаконтекстом) нужно принимать DTO объект и там его уже преобразовывать в сущность?
Обычно так и делают. Модель -> DTO -> Сущность. Модель преобразуется в DTO в контроллере, DTO передается в слой БЛ, слой БЛ делает свою БЛ, преобразует DTO в сущность и передает её в EF. Это если пишется "классическая" многослойка.
...
Рейтинг: 0 / 0
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881366
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
а на каком уровне Вы используете маппер?
...
Рейтинг: 0 / 0
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881370
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subfkthat,
а на каком уровне Вы используете маппер?
И в контролере (Модель -> DTO) и в БЛ (DTO -> Сущность). Еще, главное - никогда не пихай в автомеппер какую-либо логику - это не его работа. Ничего не мешает меппить просто то, что им легко отмеппить, остальное пускай сам сервис БЛ делает.
...
Рейтинг: 0 / 0
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
    #39881567
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subПолучается мне в слой бизнес логики(контроллер=> сервис, который работает с датаконтекстом) нужно принимать DTO объект и там его уже преобразовывать в сущность?

Да
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / AutoMapper + EF Core преобразование сущности-DTO в просто сущность
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]