powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Code First + SQL Triggers
83 сообщений из 83, показаны все 4 страниц
Code First + SQL Triggers
    #39651570
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, уважаемые коллеги.

Вопрос такой. На сколько оправдано использование в SQL-триггеров при подходе CodeFirst (EntityFramework Core)
, при наличие вариантов, которые исключают какое-либо вмешательство в SQL сервер?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651588
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,
Это чисто идеология как писать.
Главное не смешивать.
Можно бд считать импотентом и хранилищем данных. Остальное делает средний слой.
Можно делать упор на бд как гарант целостности.
Если триггер без БЛ то вообще нет проблем.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651592
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Так-то оно понятно, но интересует конкретный вопрос относительно миграции. Мешает или способствует?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651594
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,

миграции? Вы о чём?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651596
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

DbMigration... CodeFirst (EntityFramework)... изменение классоа (схемы данных)...
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651601
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaPetro123,

Так-то оно понятно, но интересует конкретный вопрос относительно миграции. Мешает или способствует?
Мешает).
И мое маленькое imho что MS что то поменяет.
Чтобы работали оба направления. Первична база и первичен АппСервер.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651611
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaВопрос такой. На сколько оправдано использование в SQL-триггеров при подходе CodeFirst (EntityFramework Core)
, при наличие вариантов, которые исключают какое-либо вмешательство в SQL сервер?

Абсолютно не оправдано. Что за варианты имеются в виду, можете озвучить?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651613
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaТак-то оно понятно, но интересует конкретный вопрос относительно миграции. Мешает или способствует?

Не то, чтобы мешают. Но не способствуют, это точно.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651615
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaskyANA,

DbMigration... CodeFirst (EntityFramework)... изменение классоа (схемы данных)...
It depends...

К примеру мы выкатываем новую версию только на часть серверов и включаем только части пользователей.
И какое-то время надо писать данные в оба места: новое и старое.

Тут триггер помогает.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651619
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAТут триггер помогает.

Слишком частный случай, а ТС пока не озвучил свои варианты использования.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651622
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Давайте я приведу конкретный пример, а за одно может чего посоветуете. Предположим, что у меня есть Computed Description свойство, мне надо хранить в нем, $"{Name} will pay you {Amount} of {CurrencyName}". При изменении в БД любого из свойств задействованных в выражении, хочется иметь "свежую" версию в свойстве Description.

Какие будут предложения?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651627
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaДавайте я приведу конкретный пример, а за одно может чего посоветуете. Предположим, что у меня есть Computed Description свойство, мне надо хранить в нем, $"{Name} will pay you {Amount} of {CurrencyName}". При изменении в БД любого из свойств задействованных в выражении, хочется иметь "свежую" версию в свойстве Description.

Какие будут предложения?

Делать это в рамках приложения. Почему? Во-первых, сегодня вам нужен {Name}, который доступен из полей записи, а завтра нужно туда добавлять, допустим, имя текущего пользователя, который из триггера будет недоступен. Во-вторых, триггеры тяжело протестировать. В-третьих, вам может быть нужно одно поведение в одном окружении, и другое в другом (dev, staging, production...).
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651629
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,

На EF ваше Computed Description может быть легко реализовано с помощью свойства, но лучше, если это будет выполняться на уровне репозитория.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651632
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,

Опять же. Это всё верно до тех пор, пока верно то, что с базой данных работает только приложение, и никто ручками в базу не лезет. Если это так, то мне тут посоветовать что-то трудно. Триггеры, конечно выглядят как решение, но по личному опыту, это не так.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651638
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttCalabonga,

Опять же. Это всё верно до тех пор, пока верно то, что с базой данных работает только приложение, и никто ручками в базу не лезет. Если это так, то мне тут посоветовать что-то трудно. Триггеры, конечно выглядят как решение, но по личному опыту, это не так.


В том-то и дело, и можно обойтись без триггера. Пока работает одно приложение (или несколько приложений), но работают они по одним правилам, то есть везде используется одна и та же функция формирования Description, то это всё работает. Но как только "ручками", кто-то править в БД будет, то триггер отработает, а без него Description будет "сломан"
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651650
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaНо как только "ручками", кто-то править в БД будет,именно.
Бд предприятия это не твоя собственность.
Либо делаете большой АппСервер и все ходят через него, либо...
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651653
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,


Я понял, спасибо всем. В общем-то, вы подтвердили мои предположения.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39651656
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaВ том-то и дело, и можно обойтись без триггера. Пока работает одно приложение (или несколько приложений), но работают они по одним правилам, то есть везде используется одна и та же функция формирования Description, то это всё работает. Но как только "ручками", кто-то править в БД будет, то триггер отработает, а без него Description будет "сломан"

Поэтому с базой должно работать одно приложение, а другие работать с данными через него. Это называется трёх-звенка .
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652153
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttCalabongaВ том-то и дело, и можно обойтись без триггера. Пока работает одно приложение (или несколько приложений), но работают они по одним правилам, то есть везде используется одна и та же функция формирования Description, то это всё работает. Но как только "ручками", кто-то править в БД будет, то триггер отработает, а без него Description будет "сломан"

Поэтому с базой должно работать одно приложение, а другие работать с данными через него. Это называется трёх-звенка .
Другими словами, это BLL должен быть реализован отдельно от БД через какой-то уровень абстракции, например через паттерн Repository. Так?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652174
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabongaпаттерн Repositoryдался вам этот паттерн.
Люди не любящие бд давно придумали слово интерцептор вмест слова триггер.
Ну, еще иногда эвент, сбытие, листенер.
Так что DbInterception должно тебя устроить.
По хорошему надо уметь писать и так и так.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652175
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabongaэто BLL должен быть реализованв сервисном слое
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652176
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,


Странный комментарий, а особенно про "писать и так и так". К чему это? Писать с использованием древнего подхода (двух-звенка) и более продвинутого (трех-звенка)... А зачем писать по-старому? Какой от этого профит?

А про людей, которые не любят БД, вообще не понял. Таких "выдумывающих" дохреналионы, а паттерн один, и какая разниница как они его называют? Главное, на мой взгляд, чтобы люди понимали что говорят их аппоненты. А как ты паттерн Repository назовёшь - уже рояля не играет.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652181
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,
Ты собрался сайты клепать или кровавый энтерпрайз?
Вот, в кровавом, надо знать триггеры, хп, нормализацию, маппинг...
Хотя конечно мы в ветке трех звенки.
Так что про старье ты зря.
Стареют инструменты, а архитектура почти нет.
Про паттерн не понял. Назвать их по другому нельзя. Их имена это словарь и константы. Это зубрить.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652182
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongahVosttпропущено...


Поэтому с базой должно работать одно приложение, а другие работать с данными через него. Это называется трёх-звенка .
Другими словами, это BLL должен быть реализован отдельно от БД через какой-то уровень абстракции, например через паттерн Repository. Так?
Ага, это типовой подход.



А ещё есть CQRS с одной БД и без Event Sourcing
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652184
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,
Или коротко по сабжу - триггеры это не старьё! Даже если появились интерцепторы.)
Ферштеен?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652187
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaСтранный комментарий, а особенно про "писать и так и так". К чему это?
Мой Вам совет: просто не обращайте внимание на его флуд
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652189
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANACalabongaСтранный комментарий, а особенно про "писать и так и так". К чему это?
Мой Вам совет: просто не обращайте внимание на его флуд ревнует))))))))
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652191
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANACalabongaСтранный комментарий, а особенно про "писать и так и так". К чему это?
Мой Вам совет: просто не обращайте внимание на его флуд

Очень дельное замечание, спасибо. А то я уже думал, что всё пропало и мы все умрем. Наверное, уважаемый разработчик не обратил внимание на тему "Code Fisrt + Triggers", потому что с технологиями всё понятно, вопрос об их смешивании. :)
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652192
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,
А зачем вам смешивать?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652193
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, уважаемые коллеги, раз уж подобрался высокообразованный контингент, то очень бы хотелось услышать ваше мнение относительно одной статьи "Архитектура приложений: концептуальные слои и договоренности по их использованию" .

Принимаются комментрии, замечания, дополнения и конструктивная критика. Особенно интересует мнение относитель но "Абстрактные уровни Data Access Layer".
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652195
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Calabonga,
А зачем вам смешивать?

Да не я смешиваю, я как раз пытаюсь доказать, что смешивать - ЗЛО!
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652196
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabongaвопрос об их смешивании. :)если вы прогер, то первый вариант ответа - не смешивать.
Это по логике.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652197
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaКстати, уважаемые коллеги, раз уж подобрался высокообразованный контингент, то очень бы хотелось услышать ваше мнение относительно одной статьи "Архитектура приложений: концептуальные слои и договоренности по их использованию" .

Принимаются комментрии, замечания, дополнения и конструктивная критика. Особенно интересует мнение относитель но "Абстрактные уровни Data Access Layer".зачем прыгать по темам? С триггером что? Интерцептор подходит?
Или флудим?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652201
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Ну, конечно же, ведь, мы ради этого тут и собрались!!! А с другой стороны, только вам можно флудить? :)
У нас свободная страна, не нравится - не читай. А понимающие люди оценят. Вы себя к каким людям отнесёте? :)
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652202
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,
Ну, я ждал ответа с логикой. Логики нет.
Пока умолкаю.
Купил попкорн)
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652204
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaКстати, уважаемые коллеги, раз уж подобрался высокообразованный контингент, то очень бы хотелось услышать ваше мнение относительно одной статьи "Архитектура приложений: концептуальные слои и договоренности по их использованию" .

Принимаются комментрии, замечания, дополнения и конструктивная критика. Особенно интересует мнение относитель но "Абстрактные уровни Data Access Layer".
Первая фраза "Построение сложных и не очень сложных систем задача не тривиальная".

Не помню, кто сказал: "просто не значит тривиально", - но там где сложно, там уж ясно, что не тривиально
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652205
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,

пролистал до "Абстрактные уровни Data Access Layer", посмотрел на картинку.
Возник вопрос. А Вы с DDD знакомы? Читали Эванса?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652207
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё CLSA напомнило: http://cslanet.com
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652208
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,


Кончено, а что смутило?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652210
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

Напомнило... Хм... Рано или поздно, каждый программист начинает писать свой "велосипед". Тут вопрос не в "велосипеде", а в том, по какие канонам его изготавливать, какие правила применять и какие инструменты использовать.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652212
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaskyANA,

Кончено, а что смутило?Мысль введения в чём?
В том, что если разбивать на слои и придерживаться договоренностей по их использованию, то станет проще?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652213
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaskyANA,

Напомнило... Хм... Рано или поздно, каждый программист начинает писать свой "велосипед". Тут вопрос не в "велосипеде", а в том, по какие канонам его изготавливать, какие правила применять и какие инструменты использовать.
Это была не критика, я Вам не оппонирую, не начинайте защищаться
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652215
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANACalabongaskyANA,

Кончено, а что смутило?Мысль введения в чём?
В том, что если разбивать на слои и придерживаться договоренностей по их использованию, то станет проще?


Именно! Потому что по такому же принципу работает, например MVC Framework. Ты точно значешь, где контролер, а где представление (view). Нет?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652217
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaskyANAпропущено...
Мысль введения в чём?
В том, что если разбивать на слои и придерживаться договоренностей по их использованию, то станет проще?
Именно!Тогда бы я поигрался с введением, чтобы просто и чётко эту мысль выразить, чтобы читающий сразу понял о чём речь пойдёт.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652225
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANACalabongaпропущено...

Именно!Тогда бы я поигрался с введением, чтобы просто и чётко эту мысль выразить, чтобы читающий сразу понял о чём речь пойдёт.

Хорошо. Принято, спасибо!
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652234
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,
Круто у тебя там по ссылке:
авторТак повелось, что с некоторого времени я перестал разделять проекты на сложные и простые,
Нашел золотую пулю.
Зы
В заголовок внеси слова ASP.NET 5.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652254
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Calabonga,
Круто у тебя там по ссылке:
авторТак повелось, что с некоторого времени я перестал разделять проекты на сложные и простые,
Нашел золотую пулю.
Зы
В заголовок внеси слова ASP.NET 5.

На самом деле, это работает и на WPF и на Core и на Silverlight работало. :)
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652257
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaНа самом деле, это работает и на WPF и на Core и на Silverlight работало. :)в смысле?
Wpf десктоп
Core сомнения
Сильвер лучше не упоминать
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652258
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,

Даже с точки зрения выдачи в гугле по ключевым надо вставить.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652269
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,

прочитал.

Репозиторий у Вас не совсем репозиторий.
TagRepository на мой взгляд не имеет смысла. Также как и Provider.

Пример:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class Post : EntityBase
{
    public string Author { get; set; }

    public string Title { get; set; }

    public string Content { get; set; }

    public string[] Tags { get; set; }

    public DateTime CreatedAtUtc { get; set; }

    public List<Comment> Comments { get; set; }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
public class Repository<T> : IRepository<T> where T : EntityBase
{
    private readonly ApplicationDbContext dbContext;

    public Repository(ApplicationDbContext dbContext)
    {
        this.dbContext = dbContext;
    }

    public virtual T GetById(int id)
    {
        return dbContext.Set<T>().Find(id);
    }

    public virtual IEnumerable<T> List()
    {
        return dbContext.Set<T>().AsEnumerable();
    }

    public virtual IEnumerable<T> List(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
    {
        return dbContext.Set<T>().Where(predicate).AsEnumerable();
    }

    public void Insert(T entity)
    {
        dbContext.Set<T>().Add(entity);
        dbContext.SaveChanges();
    }

    public void Update(T entity)
    {
        dbContext.Entry(entity).State = EntityState.Modified;
        dbContext.SaveChanges();
    }

    public void Delete(T entity)
    {
        dbContext.Set<T>().Remove(entity);
        dbContext.SaveChanges();
    }
}


Усё, о "каким-то образом обрабатывать метки (tags)" позаботится EF.

Я бы Вам посоветовал почитать про Domain Driven Design. Думаю, что Вам будет интересно.

https://www.amazon.com/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/0321834577
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652272
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и конечно всё должно быть Async
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652294
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaДругими словами, это BLL должен быть реализован отдельно от БД через какой-то уровень абстракции, например через паттерн Repository. Так?

Да, всё верно.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652297
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAНу и конечно всё должно быть Async

ja, ja, das ist fantastisch!
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652330
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

Склонен несогласиться с вами, потому что с такой реализацией успешно справляется сам DbContext, он это реализуте "из коробки". При таком раскладе Ваш Repository лишнее промежуточное звено. Поэтому, я предпочитаю кое-что добавлять в реализацию репозитория, чтобы было более полезно. Например, Mapping или Pagination. Даже сделал пару пакетов Calabonga.EntityFramework и Calabonga.EntityFrameworkCore более того, описал это в другой статье .


С другой стороны, сколько людей, столько и мнений. Весьма признателен вам, что уделили своё драгоценное внимание. Спасибо.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652332
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,


авторЯ бы Вам посоветовал почитать про Domain Driven Design. Думаю, что Вам будет интересно.

https://www.amazon.com/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/0321834577


Спасибо, я обязательно почитаю. Может чего нового найду. :)
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652345
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПример:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class Post : EntityBase
{
    public string Author { get; set; }

    public string Title { get; set; }

    public string Content { get; set; }

    public string[] Tags { get; set; }

    public DateTime CreatedAtUtc { get; set; }

    public List<Comment> Comments { get; set; }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
public class Repository<T> : IRepository<T> where T : EntityBase
{
    private readonly ApplicationDbContext dbContext;

    public Repository(ApplicationDbContext dbContext)
    {
        this.dbContext = dbContext;
    }

    public virtual T GetById(int id)
    {
        return dbContext.Set<T>().Find(id);
    }

    public virtual IEnumerable<T> List()
    {
        return dbContext.Set<T>().AsEnumerable();
    }

    public virtual IEnumerable<T> List(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
    {
        return dbContext.Set<T>().Where(predicate).AsEnumerable();
    }

    public void Insert(T entity)
    {
        dbContext.Set<T>().Add(entity);
        dbContext.SaveChanges();
    }

    public void Update(T entity)
    {
        dbContext.Entry(entity).State = EntityState.Modified;
        dbContext.SaveChanges();
    }

    public void Delete(T entity)
    {
        dbContext.Set<T>().Remove(entity);
        dbContext.SaveChanges();
    }
}




Это нормальный репозиторий.
Суть в том что можно переписать для другого ApplicationDbContext.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652356
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaskyANA,

Склонен несогласиться с вами, потому что с такой реализацией успешно справляется сам DbContext, он это реализуте "из коробки". При таком раскладе Ваш Repository лишнее промежуточное звено. Поэтому, я предпочитаю кое-что добавлять в реализацию репозитория, чтобы было более полезно. Например, Mapping или Pagination. Даже сделал пару пакетов Calabonga.EntityFramework и Calabonga.EntityFrameworkCore более того, описал это в другой статье .


С другой стороны, сколько людей, столько и мнений. Весьма признателен вам, что уделили своё драгоценное внимание. Спасибо.
Суть репозитория в том, что он скрывает за собой хранилище.
То есть это может быть и SQL Server, и MongoDB, и Couchbase, и сторонний сервис, и вообще несколько хранилишь последовательно, или параллельно.

У Вас же это выходит не репозиторий, а обёртка над EF.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652359
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabongaон это реализуте "из коробки".+1

CalabongaПоэтому, я предпочитаю кое-что добавлять в реализацию репозитория, чтобы было более полезно. Например, Mapping или Paginationну дак и это есть в NuGet маленькой добавочкой.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652360
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosЭто нормальный репозиторий.
Суть в том что можно переписать для другого ApplicationDbContext.ты с EF не работал, поэтому все переписываешь.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652361
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANACalabongaskyANA,

Склонен несогласиться с вами, потому что с такой реализацией успешно справляется сам DbContext, он это реализуте "из коробки". При таком раскладе Ваш Repository лишнее промежуточное звено. Поэтому, я предпочитаю кое-что добавлять в реализацию репозитория, чтобы было более полезно. Например, Mapping или Pagination. Даже сделал пару пакетов Calabonga.EntityFramework и Calabonga.EntityFrameworkCore более того, описал это в другой статье .


С другой стороны, сколько людей, столько и мнений. Весьма признателен вам, что уделили своё драгоценное внимание. Спасибо.
Суть репозитория в том, что он скрывает за собой хранилище.
То есть это может быть и SQL Server, и MongoDB, и Couchbase, и сторонний сервис, и вообще несколько хранилишь последовательно, или параллельно.

У Вас же это выходит не репозиторий, а обёртка над EF.
ну и что?
как только надо будет обернуть что то другое он напишет другую реализацию
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652368
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ViPRosЭто нормальный репозиторий.
Суть в том что можно переписать для другого ApplicationDbContext.ты с EF не работал, поэтому все переписываешь.
когда ж ты научишься? такое впечатление, что какой-то небольшой барьер не можешь преодолеть
как только перескочишь сразу левел будет другой
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652372
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga,

и мой пример был про то, что TagRepository и Provider не имеют смысла.
Вполне можно ограничиться PostRepository : Repository<Post> , либо вообще DbContext, но тогда возникает жёсткая зависимость от EF.

Post - это корень агрегации, сущность (Entity).
И при её сохранении EF отобразит её на все нужные таблицы, на то EF и ORM
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652375
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,
Ты helloWorld сайт написал?
А че за советы?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652376
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosskyANAпропущено...

Суть репозитория в том, что он скрывает за собой хранилище.
То есть это может быть и SQL Server, и MongoDB, и Couchbase, и сторонний сервис, и вообще несколько хранилишь последовательно, или параллельно.

У Вас же это выходит не репозиторий, а обёртка над EF.
ну и что?
как только надо будет обернуть что то другое он напишет другую реализацию
Он написал: "При таком раскладе Ваш Repository лишнее промежуточное звено".

Позволь спросить, если он выкинет это звено, то другую реализацию чего он напишет, DbContext что-ли?
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652378
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

Мне показалось, что ты сказал что это пример "неправильного" репозитория.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652390
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAСуть репозитория в том, что он скрывает за собой хранилище.

Я бы сказал больше, он скрывает за собой хранилище, и особенности хранения данных в данном хранилище, которые скрываются слоем доступа к данным.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652399
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot skyANA]CalabongaskyANA,

Суть репозитория в том, что он скрывает за собой хранилище.
То есть это может быть и SQL Server, и MongoDB, и Couchbase, и сторонний сервис, и вообще несколько хранилишь последовательно, или параллельно.

У Вас же это выходит не репозиторий, а обёртка над EF.

Репозиторий - как абстракция на доступ к БД (DAL). Его задача отвязаться от конкретной БД. То есть вашему репозиторию должно быть абсолютно фиалетово, к какой базе данных цепляться (MS SQL, PostgreSQL, SqlLite, Oracle, InMemory, etc). Таким образом, EntityFramework делает тоже самое только на основании набора Provider'ов. Именно поэтому я и говорю, что ваша реализация просто дублирует функционал, который уже делает EntityFramework. И я считаю, что в этом очень мало смысла. Поэтому я в свой репозиторий привнес немного больше обязанностей, как то: Mapping, Pagination and Secutiry (в частности, Row Level Security).

И, собственно говоря, можно сказать, что моя реализация - это "Надстройка на EntityFramework" ибо просто Repository уже в EntityFramework реализован.

P.S.: Кстати сказать, при использовании DI-контейнера паттерн Unit Of Work тоже не имеет смысла в силу того, что контейнер реализует его функционал на 100%. Но вы можете привнести своё видение в этот паттерн, и у вас будет своя обёртка. :)
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652403
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAСуть репозитория в том, что он скрывает за собой хранилище.

Я бы сказал больше, он скрывает за собой хранилище, и особенности хранения данных в данном хранилище, которые скрываются слоем доступа к данным.
Скорее такого шаблона просто нет, это частный случай враппера.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652407
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А общее правило вырисовывается в виде "оборачивай все то, что не твое или твое, но может измениться".
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652408
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosСкорее такого шаблона просто нет, это частный случай враппера.

Вовсе нет. Просто когда от репозитория хотят: фильтрацию, пейджинг, поиск, ковыряние в данных... тогда абстракция начинает плыть и рождаются уродливые год обжекст. Нужны либо спецификации, либо квери обжект, тогда всё будет путём. Не нужно из репозитория возвращать IQueryable.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652409
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosА общее правило вырисовывается в виде "оборачивай все то, что не твое или твое, но может измениться".

Нет, это как сказать, глядя на работу хирурка, режь, режь всё что попадётся под руку
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652411
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

возвращать в общем случае надо либо явно свое, либо системное
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652417
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

зато ни один гад не сможет сказать что писал не по паттернам :)
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652418
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IQuerable можно возвращать - это часть NET
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652429
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CalabongaПоэтому я в свой репозиторий привнес немного больше обязанностей, как то: Mapping, Pagination and Secutiry (в частности, Row Level Security).
А где он? Твой? Документация? Примеры?
Мы то про триггер, то про ОРМ то про паттерн.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652438
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosIQuerable можно возвращать - это часть NET

Зачем, если можно на IQueryable делать классные типизированные спецификации? Куски LINQ запросов к данным, разбросанные по классам выглядят не намного лучше размазанных SQL.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652442
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Я имею ввиду что по науке паттерностроения возврат IQuerable не может быть квалифицирована как ошибка и все.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652449
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quote Calabonga]skyANACalabongaskyANA,

Суть репозитория в том, что он скрывает за собой хранилище.
То есть это может быть и SQL Server, и MongoDB, и Couchbase, и сторонний сервис, и вообще несколько хранилишь последовательно, или параллельно.

У Вас же это выходит не репозиторий, а обёртка над EF.

Репозиторий - как абстракция на доступ к БД (DAL). Его задача отвязаться от конкретной БД. То есть вашему репозиторию должно быть абсолютно фиалетово, к какой базе данных цепляться (MS SQL, PostgreSQL, SqlLite, Oracle, InMemory, etc). Таким образом, EntityFramework делает тоже самое только на основании набора Provider'ов. Именно поэтому я и говорю, что ваша реализация просто дублирует функционал, который уже делает EntityFramework. И я считаю, что в этом очень мало смысла. Поэтому я в свой репозиторий привнес немного больше обязанностей, как то: Mapping, Pagination and Secutiry (в частности, Row Level Security).
Вы не улавливаете сути. Не только БД. Конкретная реализация репозитория вполне может работать со сторонним сервисом.
Или не только с SQL БД, но и с MongoDB. Или с Key/Value storage: Couchbase, Redis.

Можно заинжектить такую реализацию IRepository, что данные сначала будут искаться в локальной памяти, потом в распределённом кэше, в БД и если нигде нет, то запрашивать сторонний сервис, класть в БД, распределённый кэш и память
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652451
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И при этом принцип единственности ответственности не будет нарушаться
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652454
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRoshVostt,

Я имею ввиду что по науке паттерностроения возврат IQuerable не может быть квалифицирована как ошибка и все.

Превалирует мнение, что возвращаться должен IEnumerable, а не IQueryable. А для меня всё одно. И так и так -- не верно. Запросы должны быть отдельно, чтобы их можно было тестировать.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652477
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Подспудно понятно что, IEnumerable менее опасная штука, чем IQueryable. Но формально катит по всем канонам паттерноведния.
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652571
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosПодспудно понятно что, IEnumerable менее опасная штука, чем IQueryable. Но формально катит по всем канонам паттерноведния.

Да не, не катит. Проходили )
...
Рейтинг: 0 / 0
Code First + SQL Triggers
    #39652580
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Ок.
...
Рейтинг: 0 / 0
83 сообщений из 83, показаны все 4 страниц
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Code First + SQL Triggers
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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