|
2 / 2 / 1
Регистрация: 09.02.2020
Сообщений: 477
|
|
Актуальность Entity Framework 626.08.2020, 01:34. Показов 7223. Ответов 71
Подскажите, пожалуйста, востребован ли сейчас Entity Farmework 6 или есть более удобные средства для работы с БД?
0
|
|
| 26.08.2020, 01:34 | |
|
Ответы с готовыми решениями:
71
Миграции в Entity Framework Вложенный запрос в entity framework Entity framework показ данных по частям |
|
14724 / 9494 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
|
||
| 27.08.2020, 18:07 | ||
|
MsGuns, ну, справедливости ради могу сказать, что большая часть описанного - закономерное следствие использования генерации моделей и мастера этой самой генерации. Мы от такого подхода отказались и не пожалели. Модельки пишем руками (code first), так существенно удобнее.
И про хранимые процедуры я не понял. У вас сущности проецируются на хранимки?
1
|
||
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|||
| 27.08.2020, 19:39 | |||
|
Usaga,
Ну да. Шаблоны валидации например: ScaffoldColumn, Required и т.д. Хранимки. Имеются в виду SP на сервере, которые должны вернуть некий НД, мапированный в Модель как класс QbjectResult, в коде которых несколько Select`ов. EF как правило, неверно трактует ЕДИНСТВЕННЫЙ возвращаемый НД. И, как правило, не тот, который требуется. Можно, конечно, возвращать из SP несколько НД, но внятного и прозрачного механизма для работы с ними в EF нет. "Распознается" только первый, для доступа к остальным приходится писать код и ручками приводить к нужному типу. Поэтому пишу такие SP, чтобы они возвращали один НД и так, чтобы EF распознавал и мапировал в модель именно его. В общем, на реальных задачах кроме классов и контекста Модели EF приходится городить еще дополнительные классы-модели и репозиторий (репозитории). Т.е. получается "пирог" из ORM: снизу - EF, сверху - собственный. И это еще при том, что я - фулстэк и "хозяйничаю" в БД на SQL-сервере. Если бы был ограничен доступ к БД (а я знаю что это такое - работал с Oracle в "Парус" с "птичьими" правами), было бы совсем грустно ![]() Добавлено через 15 минут Тут ведь какое дело. Есть множество способов "абстрагирования", которые предоставляет шарп. Имеется в виду имплиментация. Это, может быть, хорошо, но это и бесит ! Особенно поначалу. Когда четко знаешь ЧТО надо сделать, но сомневаешься КАК. Нативный сиквел (xxxClient), функциональный (from..), linq, IF, куча всего другого (не пробовал, но видел). После php например, все это кажется "кучей-малой" и к тому же по-разному работает с разными типами серверов (провайдерами). Я, к примеру, не совсем понимаю логику разрабов EF. Ну зачем пихать результаты SP и UDF в разные типы ? Только потому, что SP ВСЕГДА возвращает int, а UDF - нет ? Или потому, что SP возвращает несколько результатов, которые могут быть как скалярами, так и НД, и при этом еще out-paramtter ? Ну так напишите ОДИН класс, имеющий несколько разных интерфейсов, но чтобы все они были совместимы. Выходные параметры ? Для UDF - они null. Несколько НД ? Бога ради - для UDF только один (если есть). Код возврата ? Пожалуйста: для SP - это return, для скалярной UDF - возвращаемое значение, для UDF с НД - кол-во записей например. И так далее.. Добавлено через 13 минут ![]() Хранимки (юзер-функции) - на сущности (классы). Это очень удобно. Есть множество случаев сложной реализации алгоритмов выборок и расчетов в БД. Зачем эти алгоритмы писать на клиенте (а ORM - это чистейшей воды "клиент" относительно SQL-сервера), тем более, что он могут меняться абсолютно автономно от тех или иных пользовательских приложений. Можно , например, какой - нибудь хитрый и ветвящийся отчет завернуть в SP, причем заюзать там вторичные индексы, залезть в другие БД и много еще чего. Причем будет полная гарантия еще и того, что на сервере все это будет бегать куда быстрее. То же самое касается и сложных модификаций, когда изменения должны быть сделаны во многих таблицах. Тут еще и возникает проблема транзакционности, которая, кстати, вернее механизм управления транзакциями, практически никак не решена в EF. То, что там есть, даже "транзакцией" назвать нельзя, не говоря уж о полноте управления ею. Поэтому я по возможности логику пишу на сервере. А в ORM вкладываю то, что уже является "продуктом" работы сервера. Вот и получается, что в большинстве проектов у меня в конструкторе EF либо пустота, либо несколько простых сущностей типа справочников болтаются. Все остальное (десятки) - это результаты UDF и SP, отмапированные IF в классы и контент (методы). Ругать меня за такой подход можно. Но, наверное, не нужно ибо бесполезно ![]() Добавлено через 8 минут ![]() С СУБД работаю давно, с конца 80-х. Когда еще все эти ORM только рождались в мозгах умных людей. Поэтому копаться в "кишках" БД для меня не проблема - скорее удовольствие
1
|
|||
|
14724 / 9494 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
|
|||||
| 28.08.2020, 07:35 | |||||
|
2
|
|||||
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|
| 28.08.2020, 12:02 | |
|
Usaga,
Весьма интересно и познавательно. Серьезно. Но вот ситуация. Есть Предметная Область (ПО). Есть ряд задач, которые поставлены и решены. Уже. Есть БД, в которой помимо информации, имеется еще и весьма значительная бизнес-логика. Тоже уже. И без меня. Моя задача - реализовать новую задачу в этой ПО. Доступ на сервер есть. Но - без коррекции имеющейся бизнес-логики. Т.е. можно писать новые SP/View/UDF.., даже создавать новые таблицы, но старые трогать нельзя понятно почему. Что бы Вы посоветовали в данной ситуации кроме EF ?
1
|
|
|
14724 / 9494 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
|
||
| 28.08.2020, 12:35 | ||
|
Я бы рассмотрел вариант отказа от использования хранимых процедур для нового функционала и перехода на EF \ Linq2Db. Тогда большую часть логики можно будет писать на C# сильно в SQL не суясь. И поддерживать миграции базы станет чуть проще, ибо не придётся перенакатывать\удалять хранимые процедуры, запросы-то на ходу генерируются. Но будет и минус: смесь подходов (SP в старом коде, EF \ Linq2Db в новом), что безусловно будет мозолить глаза немного. Ну и придётся вникать в возможности ORM. Некоторые запросы с тем же EF может быть весьма не просто написать. Я, даже спустя годы, могу до нескольких часов потратить на написание запроса на EF или на его оптимизацию. Правда такое уже всё реже) Если же решите остаться на старом подходе с хранимками, то EF (и Linq2Db) вам ни в какие ворота. Всю их мощь вы заменяете хранимками и UDF. Тогда достаточно взять простую Micro-ORM: Dapper.NET или PetaPOCO. Они вам просто будут мапить выборки на модельки и модельки на параметры хранимок. Ровно то, что вам и надо. Вы не считайте EF каким-то Must Have для вообще любой работы с СУБД. Если вы запросы берёте на себя (по любой уважительной или не очень причине), то EF становится не полезнее простого Dapper'а.
1
|
||
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
||
| 28.08.2020, 16:49 | ||
|
Короче, даппер Будем посмотретьДобавлено через 15 минут Посмотрел Dapper на метаните. Как я понял, он дает по сути единственный полезный метод Query<Model class>. Сами модели при этом создаются "ручками" (Code First) Пока я не понял особой разницы между даппером и "нативным SQL" XXXClient. Там и там запросы в коде, там и там репозиторий и опять же ручной код. При использовании EF SQL в коде нет совсем. Т.е. абсолютно. Во всяком случае в моих проектах. linq используется, конечно, но на "локальном уровне" - сортировки, простенькие группировки и т.д. Как правило, на стороне "клиента", когда сортируется уже извлеченный с SQL-сервера набор. Управление транзакциями также "ручное", т.е. составление SQL-скриптов. Такой метод я применял лет 10 назад. Более нет ни малейшего желания. Вопрос: есть ли смысл копать и пробовать дальше, а также понюхать Linq2Db, PetaPOCO и так далее ? В чем их принципиальное отличие от даппера и EF ?
1
|
||
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|
| 29.08.2020, 11:12 | |
|
1
|
|
|
14724 / 9494 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
|
||
| 30.08.2020, 04:44 | ||
exec имя процедуры @param1 @param2...EF тут вам бесполезен. Вы всё равно процедуры пишете. Ну а то, что якобы у вас SQL'я нет с EF'ом не правда. У вас всё равно есть конфигурация каждой сущности привязывающая её к хранимке. Т.е. количество кода тоже самое. Разница в использовании даппера будет в том, что у вас не будет никаких EDMX, не будет ни какого разогрева контекста, будут только репозитории с методами содержащими единственные вызовы *Query<T>("exec spname", params) и всё. И про транзакции я не понял, что вам не нравить.
1
|
||
|
Неадекват
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
|
|||||||
| 30.08.2020, 06:04 | |||||||
|
1
|
|||||||
|
14724 / 9494 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
|
||||||
| 31.08.2020, 08:08 | ||||||
|
В общем, давайте посмотрим на пример кода, где увидим (хоть и под отладкой): * Что контекст один на весь процесс * Как происходит рассинхронизация контекста, что бы это ни было * Увидим как EF реализует согласованность и тот же запрос без EF, где эта согласованность нарушается. От этого и будем плясать. А так, вы мне какую-то дичь втираете и рисуете EF совершенно неюзабельным средством работы с СУБД. Мне, как человеку уже пять лет с EF работающим очень плотно, очень смешно читать эти заявления про волшебные рассинхроны, единичные контексты и прочие согласованности данных реализуемым бог знает как.
0
|
||||||
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|||||
| 31.08.2020, 23:57 | |||||
|
Или я чегой-то недопонял ? Я где-то тут Вам пытался рассказать про транзакции, в смысле невозможность нормального управления ими в EF (это про "рассогласованность" если чо), но Вы не стали заострять тему. Про "единичные" контексты просто не понял - см. выше. Добавлено через 12 минут И еще про Так вот, в нормальных, подчеркиваю,- нормальных БД, эта самая целостность заложена в бизнес-логику сервера. Ну, всякие там форейнкеи, каскады и прочие "кишки". И никакими танцами с бубном с костром с черепами в виде Dupper, IHibernate, Linq2sql, EF и пр. эту целостность Вам порушить не удастся. Проще говоря, если у Вас есть в дочерней таблице ссылка на какую-то запись в главной, то удалить эту самую запись Вам не удастся никакими молитвами ! Если опять-таки на том же самом сервере на этот ключ не повешено каскадное удаление. Хотя, конечно, можно создать "базу" с линейными, независимыми друг от друга, как свинья на льду, таблицами. Тогда, уж конечно, заботиться о "согласованности" данных в этих таблицах приходится в самих приложениях - логика "обрастает" кодом, как собака репейниками. "Зато мы делаем ракеты", т.е. не "лезем на сервер", ага ?
0
|
|||||
|
14724 / 9494 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
|
||||||
| 01.09.2020, 06:37 | ||||||
|
А мне вы не рассказывайте про внешние ключи. Я про них не хуже вашего знаю.
0
|
||||||
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
||
| 01.09.2020, 12:22 | ||
|
Вот есть такое понятие как "цепочка проводок" в бухгалтерии. Это когда есть некий документ, который обрабатывается (проводится) через изменения в куче "таблиц", причем могут удаляться/изменяться/добавляться кучи записей в этих таблицах. В EF, как известно, нельзя через модели делать множественные изменения (вернее можно, но крайне неудобно) и в одной таблице и тем более нескольких связанных. Самый простой пример: Вот есть приходная накладная. Помимо заголовка (дата, номер, поставщик, сумма и т.д.), этот документ в базе представлен еще как минимум, фактурой и несколькими записями об оплате. Кроме того он отражается на складе - а это все в других таблицах. Надо этот документ удалить. Что мне нужно в EF ? Где имеется 4 класса модели: "Документ", "Состав документа (фактура)", "Банковские выписки", "Склад". Как прикажете писать удаление документа ? В цикле перебирать "детали" в каждой из трех таблицах и каждой давать Remove ? А потом оптом SaveChanges для всей базы ? Ну чтобы было удалено все и везде либо ничего и нигде ? Здесь ситуация, когда целостность невозможно соблюсти "штатными" средствами сервера. Нужна бизнес-логика. И есть механизм - Stored Proc. Но лазить ручками на сервер мы не можем - Коран не позволяет - все через Модель и только хардкор, пардон, Code First. Я по сравнению с Вами, новичок в EF, много чего не знаю. Но с БД работаю, смею предположить, поболее Вас. Вот расскажите мне, как всю эту лабуду залепить в одну транзакцию, которую можно будет либо подтвердить либо удалить. С помощью механизма EF исключительно ? Буду весьма признателен ибо у меня не получилось, хотя пытался
0
|
||
|
|
||
| 01.09.2020, 12:32 | ||
|
Насчёт удаления. Для сохраннности данных разве не принято просто ставить флаг "IsDeleted", а не удалять физически? Мало того что следов не найти потом. Дак и странно что "коран 1С" это позволит. Столько связей может потеряться. Ну и чем SP отличается от действия цикла? В SP вы что-то другое делаете? не перебираете таблицы?
0
|
||
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|||
| 01.09.2020, 12:54 | |||
|
Ремарочка к приведенному примеру со складом.
Банковские выписки и склад удалять, конечно, не нужно, их нужно апдейтить ![]() Добавлено через 3 минуты
0
|
|||
|
управление сложностью
|
||
| 01.09.2020, 12:55 | ||
0
|
||
|
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
|
|
| 01.09.2020, 12:56 | |
|
.. я честно скажу, когда меня в определенной части документооборота стали напрягать эти "множественные связи" в плане создания/удаления/редактирования тупой накладной, я решил отказаться от связанных таблиц, и хранить вложенные объекты документа (списки ТМЦ и т.д.) в виде JSON прямо в плоской таблице ... Тем более, что сейчас и в SQL-запросах можно использовать FromJSON, а уж сериализаторов полно во всех вариантах и серверной, и клиентской части ...
ЗЫ: ни коим образом не предлагаю к использованию, просто размышления ...
0
|
|
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|
| 01.09.2020, 12:59 | |
|
Кроме того в SQL-серверах есть еще триггеры.
Вот, кстати, еще зверюшки, оперирование которыми в модели (любой, включая EF) - для меня как бином Ньютона. Также,кстати, как и планы запросов, вторичные индексы, курсоры, временные таблицы и прочие плюшки, которые так иногда полезны, даже незаменимы при разработке серверной бизнес-логики. Как с ними в EF или том же расхваливаемым linq2sql ?
0
|
|
|
14724 / 9494 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
|
||
| 01.09.2020, 12:59 | ||
|
Решение номер один: внешние ключи на "Документ" с ON CASCADE DELETE. Удаляем "Документ", удаляются все с ним связанные данные силами самой СУБД (EF не причём). Решение номер два: выгружаем весь граф объектов подлежащих удалению (тут уже preformance penalty) и говорим EF'у удалить "Документ". Все связанные данные EF снесёт отдельными командами DELETE. EF умеет догадаться о типе и направлении отношений, но можно и конфигурацией это поднастроить. Решение номер три: если нет ключей и нет возможности полагаться на EF, то ходить руками вызывать Remove. Все три действия от вас ничего не потребуют в плане работы с транзакциями, ибо SaveChanges() выполнит все эти действия в одной транзакции.Если этого мало, то можно воспользоваться классом TransactionScope() для оборачивания серии обращений к базе в одну единую транзакцию.Я пока не вижу, что вы лично увидели неудобного. Может я не так вас понял?
0
|
||
|
14724 / 9494 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
|
||
| 01.09.2020, 13:02 | ||
|
Добавлено через 52 секунды Ах да, в Linq2Db есть ещё зачаточная поддержка Query Hints. Вроде планируют расширить поддержку этого дела. Тоже приятный бонус.
0
|
||
| 01.09.2020, 13:02 | |
|
Есть проблема с курсовой на Entity Framework Entity Framework 4 событие полной загрузки Установил Entity Framework, entitydatasource отсутствует в панели инструментов В чем разница между Entity Framework и Entity Framework Core? Entity Framework. Удаление entity без удаления связей Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|