Vladimir
Черезжопный метод это интерполяция строк через delete from nameof(Table)
а чо тут плохого) заменяешь nameof на оператор какой и все) хотя вот сча подумал может и не получится его заменить
Danil
Я в определённом контексте это говорил)) На чтение мы пользуемся даппером итак
Я в последнее время стал упорантом и пишу все на скуле
Ayrat
@Liminiens тебе похуй какой таг будет у твоего докер имаджа?
Mark
2020 год а в еф нет deleteasync да и просто delete
Он же реализует паттерн Unit Of Work, там by design удаление делается не напрямую в базе, а через накопление команд, а потом единоразовый Save.
Ayrat
Ну назови как репу хз
ну чот репа вообще интересно названа!
Vladislav
Он же реализует паттерн Unit Of Work, там by design удаление делается не напрямую в базе, а через накопление команд, а потом единоразовый Save.
Ну я тоже фаулера читал) тут скорее что это реврайт старого ефа где должны были головой думать. Но нет
Ayrat
простейшие сервисы без нагрузки легко пишутся на даппере, к нему отличный linq провайдер, зачем тащить EF?
а непростейшие лучше уже руками сиквель писать. Заменять сиквель сишарпом вообще так себе идея
Anatoly
а непростейшие лучше уже руками сиквель писать. Заменять сиквель сишарпом вообще так себе идея
тут я не соглашусь, в целом, в третьем десятилетии 21 века уже можно научиться по AST строить человеческий рекурсивный CTE или любой другой сложный запрос, но пока проще залить ef железом
Ayrat
эх
Mark
Ну я тоже фаулера читал) тут скорее что это реврайт старого ефа где должны были головой думать. Но нет
Возможно, но я не уверен. Мне всё-таки кажется, что это by design и, в принципе, оно нормально работает на своих задачах. Возможно, для твоей задачи EF в принципе не подходит.
Vasily
А из еф выпилили ,шоле, возможность плейн sql исполнять?
Ayrat
А из еф выпилили ,шоле, возможность плейн sql исполнять?
да не. просто тогда смысл всех этих танцев не ясен
Mikhαil
а как орм связан с ддд?
Удобство имплементации - в еф ты просто строишь агрегат на основе его энтити и используешь А за дал слой отвечает сам еф То есть ты в командах выполняешь действия на агрегате, а за мапинг на бд отвечает сам еф Короче глянь пример в книге мс про контейнерные приложения - у них там есть пример того о чем я говорю
Ayrat
ну типа нагородим абстракций чтобы потом вызывать над ними голый сиквель
Vasily
Я с еф работал плотно лет 10 назад, у нас все было хранимками обмазано
Vasily
Иначе там ад был
Vasily
По перформансу
Vasily
Точнее не книга даже, а онлайн пример eShop или как-то так
Очень спорное утверждение про удобство
Roman
Удобство имплементации - в еф ты просто строишь агрегат на основе его энтити и используешь А за дал слой отвечает сам еф То есть ты в командах выполняешь действия на агрегате, а за мапинг на бд отвечает сам еф Короче глянь пример в книге мс про контейнерные приложения - у них там есть пример того о чем я говорю
но аггрегат же это уже уровень бизнес логики, и там по-хорошему надо использовать отдельные модели, а не энтити переиспользовать. Не потому, что так "правильно", а пушто так действительно потом меньше гемора при изменении модели хранения или доменных типов
Roman
и тут как бэ похеру, чем ты достаешь данные из базы, не?
Mikhαil
Ну то есть разверни мысль немного плз
Roman
проблема в том, что модель хранения и доменная модель — это независимые вещи, и изменения в одной из них не должны вынуждать изменения в другой
Roman
Оригинальная бизнес-задача, которую вы собираетесь решить с помощью разработки, никакого отношения не имеет к тому, будете ли вы хранить данные в постгре, монге или кассандре, и уж тем более, как вы их оттуда будете доставать. А вот к тому, как выглядят ваши доменные типы, эта задача имеет самое прямое отношение
Doge
проблема в том, что модель хранения и доменная модель — это независимые вещи, и изменения в одной из них не должны вынуждать изменения в другой
+++++ Вот это то, что мне не нравится в традиционных ОРМ типа того же энтити. Они делают это сшитие доменной области и слоя хранения слишком притягательным.
Mikhαil
Оригинальная бизнес-задача, которую вы собираетесь решить с помощью разработки, никакого отношения не имеет к тому, будете ли вы хранить данные в постгре, монге или кассандре, и уж тем более, как вы их оттуда будете доставать. А вот к тому, как выглядят ваши доменные типы, эта задача имеет самое прямое отношение
смотри, тогда у меня вопрос есть агрегат User например. у него есть какой-то набор энтити и вэлью обжектов есть команда в который вызывается ряд методов агрегате (setProfileData, setRegistrationAddress, calculateЧтотоТам) данные методы изменяют объект агрегата в памяти (тк слой бд отделен) вот есть команда которая вызывает Н разных метолов агрегата а после этого нужно сохранить все эти изменения в бд как это будет выглядеть на скл? как понять какие поля были выставлены итд
Mikhαil
при этом мы говорим что изменения сущности идут сугубо через корень (класс User), зависимые энтити и вэлью обжекты создаются добавляются удаляются и обновяются только через него в итоге у тебя есть в доменном слое сложная иерархическая структура классов которая изменилась а в дал слой как это намаппить корректно?
Roman
смотри, тогда у меня вопрос есть агрегат User например. у него есть какой-то набор энтити и вэлью обжектов есть команда в который вызывается ряд методов агрегате (setProfileData, setRegistrationAddress, calculateЧтотоТам) данные методы изменяют объект агрегата в памяти (тк слой бд отделен) вот есть команда которая вызывает Н разных метолов агрегата а после этого нужно сохранить все эти изменения в бд как это будет выглядеть на скл? как понять какие поля были выставлены итд
Ну я бы все это вообще отвязал от слоя персистентности. Ты с каким угодно способом достаешь данные из базы, потом собираешь из них доменный тип и уже над ним совершаешь изменения. Понять, какие именно изменения были сделаны, и какие из них надо сохранить в базу — задача доменного слоя. В доменном слое ты собираешь эти изменения и в свой дата слой передаешь уже тупо набор энтитей, которые просто надо сохранить
Roman
что такое rich модель?
Roman
ок, допустим, речь про автомобиль. У тебя правило: когда скорость поднимается выше 20 кмч, вдобавок ко всему надо залочить двери. Помимо этого, разумеется, тебе нужно мутировать состояние твоего автомобиля: собсно, увеличить скорость. Вот твой метод, отвечающий за акселерацию, внутри себя имеет все необходимые проверки, и генерирует список событий, которые получились в результате выполнения команды на увеличение скорости. В данном случае генерируешь события "Скорость изменилась: новая скорость 25кмч", "Двери заблокированы", "Алерт на непристегнутого пассажира на переднем сиденье"
habib
поэтому нет, и не будет
Roman
что делать с этими событиями и как их сохранять ты уже волен решать сам.
Mikhαil
что такое rich модель?
https://thedomaindrivendesign.io/anemic-model-x-rich-model/
Mikhαil
пример тут
Mikhαil
эт когда логика работы агрегата живет в самом агрегате а не снаружи
Mikhαil
что делать с этими событиями и как их сохранять ты уже волен решать сам.
то есть ты предлагаешь мутировать агрегат а сохранение в бд делать на основе доменных событий порожденных агрегатом?
Mikhαil
мутировать агрегат в памяти
Roman
как вариант ага
Roman
можно сохранять не события, а новое состояние
Roman
тут как бы зависит от ваших нужд
Mikhαil
как вариант ага
ну а я предлагаю как вариант использовать еф)) вполне жизнеспособный вариант которым многие пользуются хотя вариант с событиясм вполне ок - если начну использовать роу скл то реально о нем подумаю
Mikhαil
хотя я согласен что есть минус в связывании доменного слоя и дал
Mikhαil
но развязать его не будет сложностей при потребности
Mikhαil
по факту агрегат со свей своей логикой у нас уже описан и если придется отказаться от еф - надо будет лишь заменить слой дал
Roman
но развязать его не будет сложностей при потребности
ну я не раз видел, как еф протекает в домен настолько, что внезапно его отвязать уже большая проблема, хотя так не кажется вовсе
Mikhαil
агрегат никуда не денется
Mikhαil
ну мы отделяем детали бд от агрегата очень строго
Roman
ну а я предлагаю как вариант использовать еф)) вполне жизнеспособный вариант которым многие пользуются хотя вариант с событиясм вполне ок - если начну использовать роу скл то реально о нем подумаю
да можно и еф как вариант, просто я не вижу, как еф или любой другой орм связан с ддд) Я про это спрашивал, а не про качество/ущербность еф
Mikhαil
я описал преимущества из-за которых мы его выбрали в контексте ддд
Vasily
Чет звучит как херня
Hog
Я попробовал ефкор для простого проекта, но только из-за того, что в некоторых вакансиях оно встречается.
Hog
Не могу ничего сказать за и против. Простые вещи вроде просто делаются. Но я был когда-то на проекте, где еф затащили изначально и там были огромные проблемы с перформансом. Еф выпилили почти отовсюду, оставили (кажется) только самые простые кейсы и то только потому, что рук не хватало всё переписывать.
Vladislav
У меня в памяти до сих пор лежит ебанина на квери синтаксисе которую я когда-то написал будучи джуном
Vladislav
Наверно худший код в моей жизни
Roman
https://thedomaindrivendesign.io/anemic-model-x-rich-model/
рич модель не понравилась тем, что ИО гвоздями прибито к логике. И логика и ио — источники проблем и непоняток. Когда ты их так жестко смешиваешь вместе, разбираться с любой ошибкой становится экспоненциально сложнее. Это, впрочем, не значит, что рич модель нельзя организовать по-человечески, без энтитей и эпоксидки
Mikhαil
Будет немного аутично но в целом терпимо
Roman
почему аутично?)
Roman
ну оно непривычно для мира сишарпа, но практические бонусы очевидны. И тестировать проще (не надо ласкать моки перед каждым тесткейсом), и в случае ошибок логи читать проще и дебажить легче
Mikhαil
Вообще с плюсами согласен
Roman
ну ты можешь выкидывать наружу и новое состояние — все зависит от того, что ты дальше хочешь делать
Ayrat
@Liminiens для бота надо выставить privacy disabled чтобы он все сообщения в группе мог читать, да?
Ayrat
у меня без этой настройки он не получает onUpdate
Ayrat
даже с явным меншном
Ayrat
странно
Vladislav
Вроде так всегда было