Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
.NET 9

EF Core. Общий контекст на связанные сущности

03.02.2025, 04:27. Показов 3299. Ответов 23

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть проект, в котором есть связанные сущности (один-ко-многим). Набор и значения в этом наборе.
Как я полагаю, я должен создать два репозитория под каждую из этих сущностей. Допустим, с помощью Include я могу получить их в репозитории набора, но если я, к примеру, добавил новый набор и туда добавил значения, или просто в уже существующий набор добавляю значения, как мне обновлять контекст, чтобы все было синхронизировано?

Должен ли у меня быть третий класс, который будет хранить общий контекст на время жизни приложения или еще что-то?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.02.2025, 04:27
Ответы с готовыми решениями:

Понятия Сущность, Модель и Контекст в Entity Framework Core
СУШНОСТЬ - это то, что описываем: объект, процесс. Это вещи о которых хотим хранить данные. Например, (название, автор, издатель, к-во...

Связанные сущности Doctrine2
Здравствуйте, у меня был и есть интернет магазин на KO3 Сейчас я портирую его на последнюю стабильную версию Symfony 2.6 в которой я пока...

Doctrine 2 и связанные сущности
Как реализовать связь, при которой в качестве внешнего ключа выступает id другой таблицы? Проблема в том, что при каскадном обновлении...

23
Эксперт .NET
 Аватар для Usaga
14096 / 9313 / 1349
Регистрация: 21.01.2016
Сообщений: 34,988
03.02.2025, 06:20
Цитата Сообщение от Vissmuy Посмотреть сообщение
который будет хранить общий контекст на время жизни приложения
Вот так точно делать не надо. У контекста есть кеш, который забиваться будет. Контекст нужно создавать на время, пока он нужен. А потом диспоузить.

Цитата Сообщение от Vissmuy Посмотреть сообщение
как мне обновлять контекст
SaveChanges() ?
0
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
03.02.2025, 07:16  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
У контекста есть кеш, который забиваться будет.
Так в этом же и суть. Чтобы постоянно к бд не обращаться за данными они кэшируются и берутся из памяти. Просто, думаю, надо следить за его наполнением, дабы в нем лишнего не оказалось, наверное. Поправьте, если не прав.

Цитата Сообщение от Usaga Посмотреть сообщение
SaveChanges() ?
Хорошо. Допустим у меня есть ViewModel, в котором проинициализированы два репозитория SetRepository и WordRepository.
Для простоты понимания чуть подробней опишу сущности. Set - набор сущностей. Word - это слово. В наборе может быть много слов. К примеру, я хочу в набор добавить слово. Во ViewModel вызываю из WordRepository метод Add. Я в правильном направлении думаю или нет?

Добавлено через 2 минуты
Но контекста то два должно быть. Один в одном репе, другой в другом. Как их связать? Ведь одна сущность связана с другой.
0
Эксперт .NET
 Аватар для Usaga
14096 / 9313 / 1349
Регистрация: 21.01.2016
Сообщений: 34,988
03.02.2025, 07:29
Цитата Сообщение от Vissmuy Посмотреть сообщение
Так в этом же и суть. Чтобы постоянно к бд не обращаться за данными они кэшируются и берутся из памяти. Просто, думаю, надо следить за его наполнением, дабы в нем лишнего не оказалось, наверное. Поправьте, если не прав.
Так если нужен кеш, то почему бы его явно не использовать?

Цитата Сообщение от Vissmuy Посмотреть сообщение
Я в правильном направлении думаю или нет?
Ну да.

Цитата Сообщение от Vissmuy Посмотреть сообщение
Но контекста то два должно быть. Один в одном репе, другой в другом. Как их связать? Ведь одна сущность связана с другой
Почему два? Можно и один, просто в конструктор репозитория передавать.
0
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
03.02.2025, 07:31  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Почему два? Можно и один, просто в конструктор репозитория передавать.
Ну так значит контекст все таки должен быть общий на несколько репов?
0
Эксперт .NET
 Аватар для Usaga
14096 / 9313 / 1349
Регистрация: 21.01.2016
Сообщений: 34,988
03.02.2025, 07:35
Vissmuy, если есть веские причины разные использовать, то можно и разные. Но обычно так не делают и переиспользуют один.
0
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
03.02.2025, 07:42  [ТС]
Usaga, хорошо, я понял.
0
1339 / 919 / 264
Регистрация: 08.08.2014
Сообщений: 2,763
03.02.2025, 07:50
Цитата Сообщение от Vissmuy Посмотреть сообщение
Но контекста то два должно быть.
Зачем вообще их хранить? Потом ещё следить за их состоянием. Потом по какой-то запутанной логике принимать решение о необходимости обновления данных из БД (когда данные там были изменены каким-то другим пользователем/приложением).

Экземпляр контекста создаётся для выполнения конкретной операции, после чего сразу же диспозится.

C#
1
2
3
4
5
6
7
8
9
public int Add(<some raw data>)
{
    using (var ctx = <create context>)
    {
        ....
        ctx.Some.Add(<some entity prepared data>);
        ctx.SaveChanges();
    }
}
0
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
03.02.2025, 07:55  [ТС]
Цитата Сообщение от kotelok Посмотреть сообщение
Экземпляр контекста создаётся для выполнения конкретной операции, после чего сразу же диспозится.
Тогда возникает необходимость постоянно обращаться к бд за данными. Данных не мало, не лучше ли их один раз получить и потом использовать из памяти?
0
1339 / 919 / 264
Регистрация: 08.08.2014
Сообщений: 2,763
03.02.2025, 07:58
Цитата Сообщение от Vissmuy Посмотреть сообщение
Данных не мало, не лучше ли их один раз получить и потом использовать из памяти?
Это не задача EF-контекста.

Полученные для отображения данные могут храниться:
1. В свойствах VM, если они нужны для отображения.
2. Где-то в кэше модели, если там и в самом деле очень много данных, к которым нужен ну очень частый доступ, и они редко меняются, а сервер БД (или API) при этом расположен далеко и обращения к нему выполняются слишком медленно.

P.S.: вообще, заморачиваться на кэширование имеет смысл только когда в этом вот прям реальная потребность возникает, потому как это сразу порождает всякие неудобные задачи - например, как принимать решение об актуализации кэша, если данные в БД могут меняться другим пользователем/приложением.
0
Эксперт .NET
 Аватар для Usaga
14096 / 9313 / 1349
Регистрация: 21.01.2016
Сообщений: 34,988
03.02.2025, 08:58
Цитата Сообщение от Vissmuy Посмотреть сообщение
Данных не мало, не лучше ли их один раз получить и потом использовать из памяти?
Для этого надо отдельный кеш использовать. Который не будет влиять на производительность обращений к базе и где можно настраивать политику вытеснения\устаревания данных. Не нужно перегружать такой обязанностью бедную ORM.
0
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
03.02.2025, 09:20  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Для этого надо отдельный кеш использовать. Который не будет влиять на производительность обращений к базе и где можно настраивать политику вытеснения\устаревания данных. Не нужно перегружать такой обязанностью бедную ORM.
А что значит отдельный кеш? Отдельный от чего?
0
Эксперт .NET
 Аватар для Rius
12999 / 7598 / 1663
Регистрация: 25.05.2015
Сообщений: 23,142
Записей в блоге: 14
03.02.2025, 09:26
https://learn.microsoft.com/ru... ew=net-8.0
IMemoryCache типа.
1
Эксперт .NET
 Аватар для Usaga
14096 / 9313 / 1349
Регистрация: 21.01.2016
Сообщений: 34,988
03.02.2025, 09:27
Vissmuy, в смысле код, умышленно реализующий функционал кеширования. А не эксплуатирование побочных эффектов того, что под это прямо не задумывалось.
1
 Аватар для Calabonga
14 / 13 / 1
Регистрация: 13.02.2025
Сообщений: 33
15.02.2025, 14:03
Цитата Сообщение от Vissmuy Посмотреть сообщение
Ну так значит контекст все таки должен быть общий на несколько репов?
Предлагаю посмотреть в сторону "Unit Of Work", возможно его применение решит вашу проблему
0
Эксперт .NET
 Аватар для Usaga
14096 / 9313 / 1349
Регистрация: 21.01.2016
Сообщений: 34,988
17.02.2025, 06:09
Calabonga, EF уже реализует данный паттерн)
0
 Аватар для Calabonga
14 / 13 / 1
Регистрация: 13.02.2025
Сообщений: 33
17.02.2025, 07:02
Цитата Сообщение от Usaga Посмотреть сообщение
EF уже реализует данный паттерн)
Это не совсем соответствует действительности, хотя "да", DbContext работает по принципу работы паттерна "Unit of Work", но при этом...
  1. тут показано как при помощи EntityFramework реализовать UnitOfWork. Зачем тогда Microsoft его еще раз реализовывает, если он уже, как вы говорите, реализован?
  2. тут уже другой пример https://antondevtips.com/blog/... in-ef-core
  3. вот еще один хороший пример реализации UnitoOfWork. Опять же показывает, что в EntityFrameworkCore есть UnitOfWork, но его надо использовать, а не надеятся, что он сделать всё за вас.
  4. а вот видео про UnitOfWork и EntityFrameworkCore, которое я делал более трех лет назад. Где как раз рассказал, какие ошибки возникающие при работе с EntityFrameworkCore решает использование паттерна UnitOfWork.

И, кстати, предполагая полемику на предмет "надо" или "не надо" использовать UnitOfWork, приведу свои доводы.

Почему НЕ надо использовать

Вот несколько аргументов в пользу того, чтобы отказаться от реализации паттернов Unit of Work и Repository при использовании EntityFramework Core:
  1. EntityFramework Core изолирует ваш код от базы данных (от любой базы данных)
  2. DbContext работает по принципу работы паттерна Unit of Work
  3. DbSet работает по принципу работы паттерна Repository EntityFramework Core имеет все возможности для Unit-тестирования (в том числе и без использования паттерна Repository)

Почему надо использовать

А вот несколько контрагрументов в ответ на аргументы из предыдущего параграфа:
  1. EntityFramework Core не дает возможности получить "из коробки" фильтрованные данные для разбития на страницы (paging), то есть нет методов типа GetPagedList<T> или GetPagedListAsync<T>
  2. EntityFramework Core не имеет возможности выдавать данные по запросы на основании ролей (прав доступа или разрешений) при выборки из базы данных, то есть вам так или иначе придется реализовывать выборки на основании ролей в каком-то слое (вы можете его называть как угодно, некоторые его называют Unit of Work).
  3. EntityFramework Core реализует доступ к данным, но никоим образом не призван реализовывать механизмы, обслуживающие ваши бизнес-процессы. Реализация бизнес-процессов, обычно начинается на уровне Repository и продолжается на уровне Unit of Work. Значит вам придется базовые принципы реализовывать самостоятельно (принципы доступа, трансформации, агрегации и т.д.). А это уже, так или иначе, Unit of Work, ну или какая-то его часть.

В любом случае, любой инструмент, нужно использовать по назначению.
0
Эксперт .NET
 Аватар для Usaga
14096 / 9313 / 1349
Регистрация: 21.01.2016
Сообщений: 34,988
17.02.2025, 07:58
Calabonga, EF уже реализует данный паттерн)
Цитата Сообщение от Calabonga Посмотреть сообщение
EntityFramework Core не дает возможности получить "из коробки" фильтрованные данные для разбития на страницы (paging), то есть нет методов типа GetPagedList<T> или GetPagedListAsync<T>
Да вообще-то всю дорогу были методы Skip и Take, которые пагинацию и реализуют...
0
 Аватар для Calabonga
14 / 13 / 1
Регистрация: 13.02.2025
Сообщений: 33
17.02.2025, 08:08
Цитата Сообщение от Usaga Посмотреть сообщение
Да вообще-то всю дорогу были методы Skip и Take,
Вообще-то, никто этого не отрицал. Вопрос в другом, Skip и Take вам нужно делать везде, где нужна пагинация. А для пагинации нужны дынные, а значит придется еще и их везде прописывать, да и пагинация бывает разная.
0
Эксперт .NET
 Аватар для Usaga
14096 / 9313 / 1349
Регистрация: 21.01.2016
Сообщений: 34,988
17.02.2025, 08:16
Calabonga, какие данные прописывать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.02.2025, 08:16
Помогаю со студенческими работами здесь

Как лучше организовать бизнес-логику и сильно связанные сущности
Доброго времени суток! Суть вот в чем. В модели Entity Framework (db first) имеется несколько сущностей, допустим &quot;Заявка&quot; и...

EntityFramework 6. Disconnected Scenario. Удалить, добавить или изменить две связанные сущности
Предположим, что у нас есть две таблицы в базе - Client и Address. Причём у Client есть внешний ключ на адрес типа int? Требуется...

Entity Core контекст не читает commit записи
Есть некая сущность Street, у нее есть поля Id и Name делаем следующее { using ArgContext context = new ArgContext(); ...

Создать модель Entity Framework, содержащую две сущности, связанные соотношением один-ко-многим
Здравствуйте, помогите создать модель. Вот задание: 1. Создайте модель Entity Framework, содержащую две сущности, связанные...

core data, две сущности
Привет. Есть база, в ней две сущности, предположим «факультет» и «студент» между ними связь много к одному и обратно). Требуется ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru