|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
Всем привет у меня есть сущность, которая используется в контексте данных Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Есть также "облегченный" DTO-вариант этой сущности, которая используется для внешнего обмена из сервиса Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Соответственно у меня возникает вопрос конвертации при добавлении/редактировании экземпляров класса Entity=>EntityDto и наоборот. ///mapper Код: c# 1. 2. 3. 4.
Когда приходит DtoEntity-я могу ее смапить в Entity c таким же ID. К сожалению это не подходит, потому что, чтобы сделать добавление в базу данных новую Entity, её необходимо сначала оттуда загрузить. В принципе я нашел способ, как в маппер инжектить dbContext и загружать сущности прямо из маппинга, но ввиду того, что в интернетах описание такой практики отсутствует+жесткое смешивание ответственностей, считаю такой способ реализации нежелательным. Второй вариант -это уже непосредственная сборка всей сущности(подгрузка связанных объектов по их ID) в контроллере или сервисе, что тоже плохо- потому что половина конвертации сущности из DtoEntity в Entity делается маппером, половина в другом месте- тоже погано получается. Возможно есть способ подсунуть EF Core только ID связанной сущности, а не подгружать её сначала, или как лучше организовать переход из DTO-объекта в объект, годный для сохранения в датаконтексте. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2019, 16:34 |
|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
Например, используй Attach: Код: c# 1. 2. 3. 4.
Но, лично я, скорее всего, все-таки, эту сущность (PropertyClass) загружал бы, если против этого нет веских причин (например, в виде критического по производительности куска кода). Потому что если снаружи придет направильный ID, то отловить и обработать нарушение FK в базе это будет намного тяжелее, чем проверить после загрузки значение на null. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2019, 17:50 |
|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
vb_subК сожалению это не подходит, потому что, чтобы сделать добавление в базу данных новую Entity, её необходимо сначала оттуда загрузить.Необязательно, в общем-то. Можно присоединить к контексту. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2019, 17:51 |
|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2019, 17:53 |
|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
petalvikAutoMapper какашко . Если лень набивать вручную код маппинга, его можно генерировать . Так и что вы предлагаете генерировать-то? Подгрузку связанных объектов по их ID? Внутри маппера? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2019, 18:00 |
|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
petalvikAutoMapper какашко . Если лень набивать вручную код маппинга, его можно генерировать . Бред. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2019, 18:00 |
|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
vb_subК сожалению это не подходит, потому что, чтобы сделать добавление в базу данных новую Entity, её необходимо сначала оттуда загрузить. Это неправда. Чтобы добавить новую Entity вы можете добавить свой экземпляр Entity в контектс, ничего не нужно загружать. vb_subВторой вариант -это уже непосредственная сборка всей сущности(подгрузка связанных объектов по их ID) в контроллере или сервисе, что тоже плохо- потому что половина конвертации сущности из DtoEntity в Entity делается маппером, половина в другом месте- тоже погано получается. Не второй, а правильный вариант, инкапсулировать работу с Entity в слое бизнес-логики. И полностью полагаться на какие-то мапперы для внесения изменений -- идея плохая. vb_subВозможно есть способ подсунуть EF Core только ID связанной сущности, а не подгружать её сначала, или как лучше организовать переход из DTO-объекта в объект, годный для сохранения в датаконтексте. Спасибо. Можно подсунуть ID связанной сущности, но это противоречит подходу EF, вы должны достать сущность и затем присоединить. Таким образом 1) гарантируется наличие связанной записи на уровне приложения 2) объект связанной сущности часто представляет часть агрегата и должен участвовать в процессе валидации на уровне приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2019, 22:34 |
|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
fkthatpetalvikAutoMapper какашко . Если лень набивать вручную код маппинга, его можно генерировать . Бред. фигня какая-то. AutoMapper умеет создавать весь маппинг автоматически. также есть динамический маппинг. в общем, эти погони за производительностью в случае маппинга напоминает больше борьбу с ветряными мельницами. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2019, 22:35 |
|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
hVosttМожно подсунуть ID связанной сущности, но это противоречит подходу EF, вы должны достать сущность и затем присоединить. Таким образом 1) гарантируется наличие связанной записи на уровне приложения 2) объект связанной сущности часто представляет часть агрегата и должен участвовать в процессе валидации на уровне приложения. Плюсую. Я выше о том же. hVosttAutoMapper умеет создавать весь маппинг автоматически. также есть динамический маппинг. в общем, эти погони за производительностью в случае маппинга напоминает больше борьбу с ветряными мельницами. Он компилирует меппинги (по умолчанию при первом вызове Map(), но можно сделать это и руками заранее), а потом уже использует откомпиленный код. Никакого рефлекшена там внутри нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2019, 23:21 |
|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
hVosttvb_subК сожалению это не подходит, потому что, чтобы сделать добавление в базу данных новую Entity, её необходимо сначала оттуда загрузить. Это неправда. Чтобы добавить новую Entity вы можете добавить свой экземпляр Entity в контектс, ничего не нужно загружать. vb_subВторой вариант -это уже непосредственная сборка всей сущности(подгрузка связанных объектов по их ID) в контроллере или сервисе, что тоже плохо- потому что половина конвертации сущности из DtoEntity в Entity делается маппером, половина в другом месте- тоже погано получается. Не второй, а правильный вариант, инкапсулировать работу с Entity в слое бизнес-логики. И полностью полагаться на какие-то мапперы для внесения изменений -- идея плохая. vb_subВозможно есть способ подсунуть EF Core только ID связанной сущности, а не подгружать её сначала, или как лучше организовать переход из DTO-объекта в объект, годный для сохранения в датаконтексте. Спасибо. Можно подсунуть ID связанной сущности, но это противоречит подходу EF, вы должны достать сущность и затем присоединить. Таким образом 1) гарантируется наличие связанной записи на уровне приложения 2) объект связанной сущности часто представляет часть агрегата и должен участвовать в процессе валидации на уровне приложения. Получается мне в слой бизнес логики(контроллер=> сервис, который работает с датаконтекстом) нужно принимать DTO объект и там его уже преобразовывать в сущность? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2019, 10:01 |
|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
vb_subПолучается мне в слой бизнес логики(контроллер=> сервис, который работает с датаконтекстом) нужно принимать DTO объект и там его уже преобразовывать в сущность? Обычно так и делают. Модель -> DTO -> Сущность. Модель преобразуется в DTO в контроллере, DTO передается в слой БЛ, слой БЛ делает свою БЛ, преобразует DTO в сущность и передает её в EF. Это если пишется "классическая" многослойка. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2019, 10:09 |
|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
fkthat, а на каком уровне Вы используете маппер? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2019, 10:11 |
|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
vb_subfkthat, а на каком уровне Вы используете маппер? И в контролере (Модель -> DTO) и в БЛ (DTO -> Сущность). Еще, главное - никогда не пихай в автомеппер какую-либо логику - это не его работа. Ничего не мешает меппить просто то, что им легко отмеппить, остальное пускай сам сервис БЛ делает. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2019, 10:17 |
|
AutoMapper + EF Core преобразование сущности-DTO в просто сущность
|
|||
---|---|---|---|
#18+
vb_subПолучается мне в слой бизнес логики(контроллер=> сервис, который работает с датаконтекстом) нужно принимать DTO объект и там его уже преобразовывать в сущность? Да ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2019, 13:48 |
|
|
start [/forum/topic.php?fid=17&fpage=3&tid=1349098]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 231ms |
total: | 352ms |
0 / 0 |