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

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

03.02.2025, 04:27. Показов 1869. Ответов 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
13481 / 9013 / 1326
Регистрация: 21.01.2016
Сообщений: 33,826
03.02.2025, 06:20
Цитата Сообщение от Vissmuy Посмотреть сообщение
который будет хранить общий контекст на время жизни приложения
Вот так точно делать не надо. У контекста есть кеш, который забиваться будет. Контекст нужно создавать на время, пока он нужен. А потом диспоузить.

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

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

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

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

Цитата Сообщение от Vissmuy Посмотреть сообщение
Но контекста то два должно быть. Один в одном репе, другой в другом. Как их связать? Ведь одна сущность связана с другой
Почему два? Можно и один, просто в конструктор репозитория передавать.
0
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 223
03.02.2025, 07:31  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Почему два? Можно и один, просто в конструктор репозитория передавать.
Ну так значит контекст все таки должен быть общий на несколько репов?
0
Эксперт .NET
 Аватар для Usaga
13481 / 9013 / 1326
Регистрация: 21.01.2016
Сообщений: 33,826
03.02.2025, 07:35
Vissmuy, если есть веские причины разные использовать, то можно и разные. Но обычно так не делают и переиспользуют один.
0
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 223
03.02.2025, 07:42  [ТС]
Usaga, хорошо, я понял.
0
1329 / 909 / 264
Регистрация: 08.08.2014
Сообщений: 2,671
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
Сообщений: 223
03.02.2025, 07:55  [ТС]
Цитата Сообщение от kotelok Посмотреть сообщение
Экземпляр контекста создаётся для выполнения конкретной операции, после чего сразу же диспозится.
Тогда возникает необходимость постоянно обращаться к бд за данными. Данных не мало, не лучше ли их один раз получить и потом использовать из памяти?
0
1329 / 909 / 264
Регистрация: 08.08.2014
Сообщений: 2,671
03.02.2025, 07:58
Цитата Сообщение от Vissmuy Посмотреть сообщение
Данных не мало, не лучше ли их один раз получить и потом использовать из памяти?
Это не задача EF-контекста.

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

P.S.: вообще, заморачиваться на кэширование имеет смысл только когда в этом вот прям реальная потребность возникает, потому как это сразу порождает всякие неудобные задачи - например, как принимать решение об актуализации кэша, если данные в БД могут меняться другим пользователем/приложением.
0
Эксперт .NET
 Аватар для Usaga
13481 / 9013 / 1326
Регистрация: 21.01.2016
Сообщений: 33,826
03.02.2025, 08:58
Цитата Сообщение от Vissmuy Посмотреть сообщение
Данных не мало, не лучше ли их один раз получить и потом использовать из памяти?
Для этого надо отдельный кеш использовать. Который не будет влиять на производительность обращений к базе и где можно настраивать политику вытеснения\устаревания данных. Не нужно перегружать такой обязанностью бедную ORM.
0
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 223
03.02.2025, 09:20  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Для этого надо отдельный кеш использовать. Который не будет влиять на производительность обращений к базе и где можно настраивать политику вытеснения\устаревания данных. Не нужно перегружать такой обязанностью бедную ORM.
А что значит отдельный кеш? Отдельный от чего?
0
Эксперт .NET
 Аватар для Rius
12350 / 7335 / 1625
Регистрация: 25.05.2015
Сообщений: 22,193
Записей в блоге: 14
03.02.2025, 09:26
https://learn.microsoft.com/ru... ew=net-8.0
IMemoryCache типа.
1
Эксперт .NET
 Аватар для Usaga
13481 / 9013 / 1326
Регистрация: 21.01.2016
Сообщений: 33,826
03.02.2025, 09:27
Vissmuy, в смысле код, умышленно реализующий функционал кеширования. А не эксплуатирование побочных эффектов того, что под это прямо не задумывалось.
1
 Аватар для Calabonga
11 / 11 / 0
Регистрация: 13.02.2025
Сообщений: 19
15.02.2025, 14:03
Цитата Сообщение от Vissmuy Посмотреть сообщение
Ну так значит контекст все таки должен быть общий на несколько репов?
Предлагаю посмотреть в сторону "Unit Of Work", возможно его применение решит вашу проблему
0
Эксперт .NET
 Аватар для Usaga
13481 / 9013 / 1326
Регистрация: 21.01.2016
Сообщений: 33,826
17.02.2025, 06:09
Calabonga, EF уже реализует данный паттерн)
0
 Аватар для Calabonga
11 / 11 / 0
Регистрация: 13.02.2025
Сообщений: 19
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
13481 / 9013 / 1326
Регистрация: 21.01.2016
Сообщений: 33,826
17.02.2025, 07:58
Calabonga, EF уже реализует данный паттерн)
Цитата Сообщение от Calabonga Посмотреть сообщение
EntityFramework Core не дает возможности получить "из коробки" фильтрованные данные для разбития на страницы (paging), то есть нет методов типа GetPagedList<T> или GetPagedListAsync<T>
Да вообще-то всю дорогу были методы Skip и Take, которые пагинацию и реализуют...
0
 Аватар для Calabonga
11 / 11 / 0
Регистрация: 13.02.2025
Сообщений: 19
17.02.2025, 08:08
Цитата Сообщение от Usaga Посмотреть сообщение
Да вообще-то всю дорогу были методы Skip и Take,
Вообще-то, никто этого не отрицал. Вопрос в другом, Skip и Take вам нужно делать везде, где нужна пагинация. А для пагинации нужны дынные, а значит придется еще и их везде прописывать, да и пагинация бывает разная.
0
Эксперт .NET
 Аватар для Usaga
13481 / 9013 / 1326
Регистрация: 21.01.2016
Сообщений: 33,826
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
Ответ Создать тему
Новые блоги и статьи
Рисование коллайдеров Box2D v2 на Three.js с помощью порта @box2d/core
8Observer8 06.06.2025
Используется порт Box2D v2 под названием @box2d/ core - пакет NPM. Загрузил документацию Box2D v2 на Netlify: https:/ / box2d-v2-docs. netlify. app/ Документацию Box2D v2 можно скачать с официального. . .
Как создать стек в Python
AI_Generated 05.06.2025
Как архитектор с более чем десятилетним опытом работы с Python, я неоднократно убеждался, что знание низкоуровневых механизмов работы стеков дает конкурентное преимущество при решении сложных задач. . . .
Server-Sent Events (SSE) в Node.js
run.dev 05.06.2025
Потоковая передача данных с сервера прямо в браузер стала повседневной потребностью - от биржевых графиков и спортивных трансляций до чатов и умных дашбордов. Много лет разработчики полагались на. . .
Создаем RESTful API на Golang с Fiber
golander 04.06.2025
Я перепробовал десятки фреймворков для создания RESTful API за последние годы, и когда впервые столкнулся с Fiber, понял, что это совсем другой уровень. Нет, я не собираюсь рассказывать сказки о. . .
Как работать с куки в ASP.NET Core
UnmanagedCoder 04.06.2025
Когда я впервые начал работать с куки в ASP. NET Core, меня поразило, насколько отличается работа с ними от классического ASP. NET. В Core все стало более декомпозированным - больше нет удобного. . .
Рисование коллайдеров физического движка Box2D-WASM v3 на Three.js
8Observer8 04.06.2025
Erin Catto (автор Box2D) переписал с нуля Box2D v2 с С++ на Си и появилась версия Box2D v3. Birch-san собрал Box2D v3 в WebAssembly (WASM), чтобы можно было использовать Box2D v3 на JavaScript. В. . .
Worker Threads и многопоточность в Node.js
Reangularity 03.06.2025
Если вы когда-нибудь посещали собеседования на позицию Node. js разработчика, почти наверняка слышали заезженную фразу: "Node. js - однопоточная платформа". Звучит как неоспоримый факт, который. . .
Event-Driven CQRS на C# с паттерном Outbox
stackOverflow 03.06.2025
В традиционной модели происходит примерно следующее: вы получаете команду, обрабатываете ее, сохраняете результат в базу данных и затем пытаетесь опубликовать событие в брокер сообщений. Но что если. . .
OwenLogic: перенос сетевых переменных в панель Weintek (EasyBuilder Pro)
ФедосеевПавел 03.06.2025
ВВЕДЕНИЕ ПЕРЕД ЭКСПЕРИМЕНТАМИ - СОЗДАЙТЕ РЕЗЕРВНЫЕ КОПИИ ПРОЕКТОВ На момент написания статьи (02 июня 2025 г. ) самыми актуальными версиями ПО являются: OwenLogic v. 2. 10. 366 EasyBuilder Pro. . .
Dev-c++5.11 Покорение вершины
russiannick 02.06.2025
С утра преследовала одна мысль - вот бы выучить С++. Сказано-сделано. Окончив смену, скачал в интернете бестселлер Дэвиса Dev-C++ для чайников. Книга оказалась интересной и я скачал среду, на примере. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »