#c# #entity-framework #dependency-injection #blazor #lifetime
#c# #entity-framework #внедрение зависимостей #блейзор #время жизни
Вопрос:
Я работаю над своим первым проектом Blazor, и я столкнулся с проблемой времени жизни объекта.
Точная проблема заключается в том, что мой EF DbContext
никогда не утилизируется, поэтому после первого обновления базы данных любое последующее обновление завершается неудачно из-за исключения, сообщающего мне, что объект уже отслеживается контекстом.
Итак, после расследования я обнаружил, что все службы, внедряемые в зависимости, разрешаются при запуске приложения и никогда не удаляются, так же как и DbContext
, которые вводятся как UnitOfWork
В MVC объект конечной точки удаляется каждый раз, когда завершается вызов, поэтому DbContext
удаляется, и эта проблема никогда не возникает.
Но в Blazor время жизни объекта отличается. В качестве хорошей практики я должен вручную разрешать DbContext
, когда это необходимо, или что-то пропустил?
РЕДАКТИРОВАТЬ: я должен также добавить, что мой DbContext
добавлен в IServiceCollection
как Scoped
Комментарии:
1. как именно вы вводите свой DbContext? опубликуйте код. пожалуйста.
2. Услуги. Добавить DbContext<EquipmentsDbContext>(параметры);
Ответ №1:
Blazor не имеет удобных областей запроса, которые есть у сервера.
Вы должны управлять контекстом самостоятельно, вы не можете оставить его (полностью) DI.
На этой странице показано, как либо
- управляйте контекстом в области метода с помощью
using( ... )
- или связать его со временем жизни компонента с
@implements IDisposable
В обоих случаях вы можете использовать DbContextFactory (стандартная проблема в EF5), чтобы создать его, используя зарегистрированные параметры конфигурации.
Поэтому никогда не вводите сам DbContext.
Комментарии:
1. Я впервые создал шаблон Factory. и это работает как шарм!