Blazor Server - DbContext удаляется после обновления страницы - PullRequest
1 голос
/ 08 апреля 2020

Я занимаюсь разработкой серверного приложения Blazor, в котором у всех клиентов будет список things, любой из этих клиентов может обновить thing, что должно затем вызвать обратный вызов, сообщающий всем клиентам о необходимости вызова DbContext.Entry(thing).Reload(), чтобы они ' в курсе. Это прекрасно работает и работает, пока я не обновлю sh страницу, затем я получаю ошибку 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 Ответ

0 голосов
/ 10 апреля 2020
  1. Вы можете изменить RefreshService для Области, а не для Singleton
  2. AddDbContextPool не полностью удаляет экземпляр dbcontext, он сбрасывает экземпляр в его состояние по умолчанию и может быть из-за сброса что он не может получить к нему доступ снова
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...