Blazor服务器-DbContext在刷新页面后被释放



我正在开发一个Blazor服务器应用程序,其中所有客户端都将有一个things的列表,这些客户端中的任何一个都可以更新thing,然后会触发一个回调,告诉所有客户端调用DbContext.Entry(thing).Reload(),以便它们是最新的。这一切都很好,直到我刷新页面,然后我得到了Cannot access a disposed object错误,我不知道如何绕过它。

我有以下服务:

services.AddDbContextPool<MainDbContext>(...);
services.AddSingleton<RefreshService>();

RefreshService.cs:

public class RefreshService {
public Func<long, Task> OnRefreshThing { get; set; }
public void RefreshThing(long thingId) => OnRefreshThing?.Invoke(thingId);
}

Index.blazor:

protected override void OnInitialized() {
RefreshService.OnRefreshIssue += OnRefreshIssue;
}
private async Task OnRefreshThing(long thingId) {
// This works perfectly until I refresh the page & try to call it again
Thing thing = await MainDbContext.Things.FindAsync(thingId); // exception is thrown here
await MainDbContext.Entry(thing).ReloadAsync();
}

这里有一个触发错误的例子:

Thing thing = Things.Where(t => t.ThingId == 1);
thing.Name = "New name";
RefreshService.RefreshThing(thing.ThingId);
  1. 您可以将RefreshService修改为Scoped而非Singleton
  2. AddDbContextPool没有完全释放dbcontext的实例,它将实例重置为默认状态,可能是因为重置,它无法再次访问它

相关内容

  • 没有找到相关文章

最新更新