Безопасный доступ к одной базе данных с нескольких DBContext (Entity Framework C#)
возник один вопрос при разработке своего приложения. В чем суть? Была задача создать общее приложение, в котором несколько модулей (отдельные исполняемые файлы). Причины такого решения объяснять не буду, но главное, что так требовалось. В данный момент возникла потребность работы с базами данных, я работаю с DBContext (Entity Framework C#) и все хорошо если я подключаюсь к базе данных с одного модуля. Но через некоторое время возникла потребность также обращаться к базе данных с нескольких модулей одновременно. Как я знаю в Entity Framework подгрузка изменений с базы данных идет не постоянно, поэтому при изменении базы данных (какой-либо строки) в одном модуле, в других изменения не отобразятся. В этом и состоит проблема.
Можно ли как-то сделать синхронизацию, может заново подгружать при обновлении? Пока в голове только одна мысль: сделать отдельный модуль, который единственный будет иметь доступ к базе данных, и к этому модулю обращаться с других по надобности. Но это займет довольно много времени. Поэтому не знаю что делать. Если есть эксперты - с радостью выслушаю предложения )
PS: На данный момент "общение" между другими модулями осуществляется по веб-сокету, возможно его также можно использовать для решения
Ответы (1 шт):
С решением помогли в комментариях. Было несколько вариантов:
- создать отдельный микросервис который будет один принимать запросы и давать на них ответы. Данный вариант довольно затратный, это почти как писать отдельный
API, на это времени нет. - синхронизировать все
DBContext'ы. Тут тоже довольно сложно, прочитал несколько статей про синхронизацию, были варианты сделать все на основе организации трехэлементных очередей, но тут также надо потратить время и силы что бы все организовать. - последний вариант, это каждый раз при запросе создавать новый
DBContext. В таком случае, данные будут подгружаться с базы данных а не с локального кэша, соответсвенно всегда будут актуальными. При записи также, делаем все изменения которые надо, далееSaveChanges()и данные сразу сохраняются в базу данных.
Последний вариант видел давно, но многие говорили что создавать каждый раз новый контекст это слишком затратно будет для памяти программы. Однако я попробовал сделать после совета @AlexanderPetrov, проверил по времени обработки запроса, и по итогу разница совсем незначительная, при этом и данные всегда актульные.
Благодарю за помощь @AlexanderPetrov и @CrazyElf