问题描述
我正在做我的第一个Blazor项目,并且面临对象生命周期的问题。
确切的问题是我的EF DbContext
从未被处置过,因此在第一次数据库更新后,任何后续更新都会失败,因为有一个异常告诉我该上下文已经跟踪了该实体。
因此,经过调查,我发现所有依赖注入服务都在应用启动后就解决了,并且从未得到处置,DbContext
也作为UnitOfWork注入了
在MVC中,每次调用结束时都会处理端点对象,因此DbContext
被处理,并且永远不会发生此问题。
但是在Blazor中,对象的生存时间有所不同。作为一项好习惯,我应该在需要时手动解决DbContext
还是遗漏了某些东西?
编辑:
我还应该添加我的DbContext
作为IServiceCollection
添加到Scoped
解决方法
Blazor没有服务器拥有的便捷的请求范围。
您应该自己管理上下文,不能(完全)将其留给DI。
This page向您展示如何实现
- 使用
using( ... )
在方法范围内管理上下文
- 或通过
@implements IDisposable
将其链接到组件生命周期
在两种情况下,您都可以在使用已注册的配置选项时使用DbContextFactory(EF5中的标准问题)来创建它。
所以永远不要注入DbContext本身。