我确实知道 Scoped、Singleton 和 Transient 服务生命周期之间的区别,但我的知识仅限于无状态的 MVC 应用程序。
当我使用 AddScoped(每个请求的生命周期)添加一个 EntityFramework 上下文时,混乱的根源就开始了,然后,我需要做的就是更新我的数据库:
public void SaveUser()
{
db.SaveChanges();
}
这与 MVC 应用程序非常不同,因为在那里,对象与上下文完全解耦,例如,它们被转换为 JSON 并发送到客户端,或者从客户端到服务器(或者换句话说,另一个请求制作):
public void SaveUser(User updatedUser)
{
var existing = db.Users.Find(updatedUser.Id);
existing.Name = updatedUser.Name;
db.SaveChanges();
// I can also use something like Attach() or Update() instead.
}
这在 Razor 组件中是可能的,因为所有对象(我已经绑定到 UI)仍然由上下文以有状态的方式通过SignalR
. EF Context 似乎“永远不会”被处置。
在 MVC 应用程序中,EntityFramework 上下文在每个请求之前重新创建,并在之后处理(正如您所期望的那样AddScoped
)。
所以,我有三个问题:
- Razor Components 中的“请求”到底是什么。服务器端 Blazor(从服务生命周期的角度来看)?
- 客户端丢失连接并在之后重新连接怎么办?
- 在任何情况下我需要验证对象是否“仍然”被上下文跟踪,或者这种问题永远不会发生?