|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
|
Мапинг ef-core и наследная база20.08.2021, 14:41. Показов 7023. Ответов 37
Метки нет (Все метки)
Есть древняя база данных. База рабочая и пока ещё даже развивается. Структура продумана не очень хорошо.
И есть сервис, в рамках которого описаны структуры данных, которые частично мапятся на таблицы БД по сложным правилам (и для чтения, и для записи). Например, в поле базы данных может храниться форматированная строка, представляющая из себя массив пар значений, или даже JSON, который при заборе из базы нужно получить не в виде строки, а в виде вложенной коллекции/словаря распарсенных объектов. Например, в самом простом случае, это будет что-то типа: "1;2;3;4;5;6" => List<int>.Вопрос - есть ли смысл пытаться прописать весь этот сложный мапинг в EF-контексте через fluent-API и самописные конвертеры, или же разумнее будет автоматически создать контекст по базе, а мапинг между ним и объектами сервиса реализовывать вручную в методах репозиториев?
0
|
|
| 20.08.2021, 14:41 | |
|
Ответы с готовыми решениями:
37
NHibernate мапинг Dapper мапинг Мапинг связанных сущностей в DTO |
|
|
||||
| 23.08.2021, 12:04 | ||||
|
Но сначала, хочется убедиться что настроенно именно так. SomeData - Entity в БД, RawData и ProcResult - навигационные поля ведущие на реальные данные. Если нет, то где ключи и как вообще должно были данные загрузиться. Если SomeData не БД сущность, то вообще не понятно от чего сыр бор. Заполняй, выгружай. Всё равно оно на что-то должно проецироваться.
Если это калькулируемое поле, то зачем тут ЕФ. Или ситуация немного не такая или обычно задача решалась вот так: 1. Выборка вытаскивает SomeData. У него и будет поле RawData. 2. Вызывается метод Fill/Calculate() который делает какие-то действия, сбор даных или ещё что-то. 3. Конечные данные сохраняются в ProcResult 4. Сущность сохраняем. ЕФ ефтоматом сохраняет и данные и результат (в другой таблице, а здесь у нас ключ на него). Или хочется увидеть хороший пример и ТЗ.
1
|
||||
|
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
|
||
| 23.08.2021, 12:11 | ||
|
kotelok, вроде бы EF Core может в приватные поля и свойства. Но должен быть конструктор без параметров.
Добавлено через 3 минуты
1
|
||
|
|
|||
| 23.08.2021, 12:21 | |||
|
Когда я сталкиваюсь с тем что нужно что-то усложнить или уже усложнено, я стараюсь первое время убежать из этого места. Моя жизненная позиция пока такова - я не считаю что нет безвыходных вариантов и нужно что-то усложнять или костылить. Всегда можно найти хороший вариант, с очевидным и не запутанным сценарием. В самом первом ответе, MsGuns, сразу дал ответ с которым многие согласятся. Добавлено через 1 минуту
1
|
|||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 23.08.2021, 12:34 [ТС] | ||
|
Вторая часть вопроса уже относилась не к исходному сообщению, а к тому, как восстановить сущность с приватными сеттерами, если согласно логике данной сущности через параметры конструктора она все эти данные принимать не может. Безотносительно EF или ещё какого-то решения, EF тут был просто как вариант решения, которое умеет из коробки в приватные поля данные напрямую восстанавливать.
0
|
||
|
|
||||||
| 23.08.2021, 12:47 | ||||||
|
Может конечно и фигню сморожу, но для EF нужно только вот такое определение для выгрузки и сохранения данных
EF это ведь только надстройка для ADO .NET, он не умеет в бизнес-логику, это только получи -> отследи -> сохрани назад. Я так думаю (с) ...
1
|
||||||
|
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
|
||
| 23.08.2021, 12:49 | ||
|
kotelok, вы не поняли) То, что вы репозиториев всяких наделали с прослойками это понятно. Но у вас, получается, бизнес-логика (по сути валидация) отрабатывает сразу, по мере чтения и материализации данных. Т.е. этот процесс слит во-едино. Границы между этими процессами у вас нет.
А это приведёт к описанным ранее проблемам. В частности, к тому, что пользователь не сможет отредактировать данные. Как их будет техподдержка редактировать мне тоже не понятно. Просто потому, что в процессе чтения задействованы правила, которые должны отрабатывать перед сохранением... Добавлено через 41 секунду
1
|
||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 23.08.2021, 13:02 [ТС] | ||
|
Andrey-MSK,
Да, всё верно. Просто есть ещё немного другой подход под другие сценарии. Сам его не использовал, но видел несколько раз в статьях и презентациях. Когда проектирование начинается не с базы даннных и её структуры, а именно с объектов бизнес-логики. Которые потом можно напрямую спроецировать на какое-то хранилище (которое будет на 100% соответствовать требованиям бизнес-объектов), описав EF/NHibernate-контекст прямо поверх этих сущностей посредством fluent-API (т.е. не нагружая сами сущности ORM-зависимостями). При этом ORM при восстановлении сущностей предполагает, что хранилищие не может быть повреждено извне, а потому восстанавливает значения свойств в обход бизнес правил записывая значения напрямую в backing fields через reflection. Добавлено через 6 минут 1. При запросе данных они (не суть как) попадают в какие-то DTO без какой-либо валидации на этапе чтения. Этот DTO уходит клиенту и как-то визуализируется (даже если там некорректные данные в силу ошибок хранилища или новых бизнес-правил). 2. Когда пользователь нажимает OK, то на сервер приходит какой-то DTO на базе которого сервис выполняет валидацию и, если всё ок, отправляет (не суть как) данные на сохранение. У меня это просто очередная попытка натянуть 'always-valid rich-model' на реальное приложение. И пока не очень получается.
0
|
||
|
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
|
|
| 23.08.2021, 18:01 | |
|
1
|
|
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|
| 23.08.2021, 18:02 | |
|
kotelok, Возможно, я ошибаюсь, но складывается такое впечатление:
Есть три "ипостаси" информации: хранение, представление(интерпретация) и отображение. Стоит задача реализовать нетривиальный алгоритм "трансформации" из одной "ипостаси" в другую, например, отобразить с последующей возможностью правки сложные данные, хранящиеся в базе как атомы (поле таблицы): json, xml, список, множество, массив, черт в ступе и т.д. И Вы пытаетесь решить эту задачу сугубо через EF, который, грубо говоря, не для этого был сделан. Можно, конечно, попробовать сделать зубочистку на пилораме, на зачем ?
0
|
|
|
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
|
|
| 23.08.2021, 18:07 | |
|
MsGuns, не, тут немного другое. ТС захотел организовать соблюдение инварианта данных на всех стадиях жизни модели. В сущности, этот вопрос к EF'у отношения не имеет. Как и решения полного.
0
|
|
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 23.08.2021, 18:32 [ТС] | ||
|
MsGuns,
Не, я просто, видимо, не очень конкретно вопросы задавал, потому недопонимание возникло. EF - чисто инструмент для сохранения/восстановления. Просто я предполагал через использование fluent-API немного сократить объём кода по явной ручной перегонке данных из базы в сущности предметной области. Ну и по результатам экспериментов, оно в целом работает. Т.е. можно прямо поверх доменной сущности реализовать EF/NHibernate-контекст, который будет её корректно сохранять/восстанавливать "как есть" (со всеми вложенными коллекциями, даже если все сеттеры приватные). И в идеальных условиях оно просто один-в-один на базу ложится. А в случае реализации нормальных доменных сущностей поверх древней базы, контекст может так же взять на себя немного дополнительной конвертации (чисто технической, как в примере из изначального поста, когда в базе данные кривовато хранятся).
0
|
||
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|
| 23.08.2021, 18:35 | |
|
0
|
|
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 24.08.2021, 15:28 [ТС] | ||
|
В общем, по итогам экспериментов всё свелось к ...
0
|
||
|
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
|
|
| 26.08.2021, 05:41 | |
|
0
|
|
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 26.08.2021, 07:53 [ТС] | ||
|
Т.е. удобно было бы сделать detail-таблицу с полями: parameter_name (pk) master_id (fk) value_1 value_2 value_N А вместо этого соорудили такое вот нагромождение полей в master-таблице: parameter_one_value_1 parameter_one_value_2 parameter_one_value_N parameter_two_value_1 parameter_two_value_2 parameter_two_value_N ....
0
|
||
|
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
|
||
| 26.08.2021, 08:04 | ||
|
Для сущностей с динамическим набором свойств заводят дополнительную таблицу, где каждая строка есть отдельное свойство с маркером типа этого свойства. Или просто в JSON\XML сериализуют это дело и пихают в одно поле. А так как вы задумали, делать не надо. Это костылина. EF тут ни причём, что такую дичь не поддерживает.
0
|
||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
|
| 26.08.2021, 08:21 [ТС] | |
|
0
|
|
|
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
|
|
| 26.08.2021, 08:23 | |
|
kotelok, какая разница откуда эта база взялась? База у вас? Код, который с ней работает, тоже? Так не проблема исправить этот момент. И тогда станет возможно использовать EF с такой таблицей. Убогие моменты можно и исправлять, а не подстраиваться под них.
0
|
|
| 26.08.2021, 08:23 | |
|
SPRING JPA правильный мапинг даты Мапинг View из Firebird 2.5 в Entity Framework 6
AMD E-350 (1.6) vs Intel Dual-Core/Core 2 Duo/i3 (1st gen) Что брать Core i7 4960X 2011 или Core i7 4770 1150 ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс
Ссылка на сгенерированную музыкальную композицию:
https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013
Я говорю, что Время- как вода
течет. . .
|
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла:
Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
|
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет
Новости компьютерного мира и их обсуждение (4)
Салют, шампанское, овации!
:drink:
|
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр.
Дословно, отклонённая. . .
|
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2.
Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
|
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
|