Сводка
На моей странице Razor одно действие пользователя запускает два события. Эти события приводят к вызовам EF, что приводит к ошибке:
System.InvalidOperationException HResult = 0x80131509 Сообщение = Вторая операция, запущенная в этом контексте перед завершением предыдущей операции. Обычно это вызвано тем, что разные потоки используют один и тот же экземпляр DbContext.
Настройка Вместо одного огромного DBContext у меня несколько контекстов, каждый из которых сосредоточен на небольшой области функциональности. в БД. Итак, давайте представим, что здесь я имею дело с функциональностью для работы с People.
Поэтому у меня есть PeopleContext и PeopleService. При моем запуске они регистрируются как:
services.AddDbContext<PeopleContext>();
services.AddScoped<PeopleService>();
И контекст - это зависимость, внедренная в сервис:
public class PeopleService
{
public PeopleService(PeopleContext context)
{
this.Context = context;
}
private PeopleContext Context { get; }
Действия
Итак, представьте себе страницу с сеткой с левой стороны, показывающую сводную информацию о каждом человеке, и область с правой стороны, где мы показываем сведения о выбранном человеке.
Когда кто-то щелкает строкув сетке, мы звоним в Службу, чтобы загрузить полную информацию об этом человеке и отобразить эти данные в правой части.
У нас также есть кнопка [Редактировать] в сетке. Когда кто-то щелкает по нему, открывается модальное окно. Это окно вызывает метод SAME в SAME Service (следовательно, использует тот же контекст), чтобы загрузить все детали, чтобы мы могли отредактировать человека.
Итак, моя проблема, конечно, в том, что когда кто-то щелкаеткнопка [Edit] в Grid, они также выбирают текущую строку, и поэтому метод вызывается дважды почти одновременно, что приводит к конфликту, указанному выше.
Решение
Не думаю, что я хочу использовать концепцию блокировки, потому что это может привести к проблемам с производительностью. Я также не хочу дублировать метод в другом Сервисе, потому что я хочу, чтобы мой код был СУХИМ. Я не уверен, что имеет смысл не запускать событие SELECT ROW, когда кто-то нажимает кнопку в строке. Я также не могу быть первым человеком, который столкнется с этим, поэтому должна быть установленная «лучшая практика» для такого рода поведения - отсюда и этот пост, чтобы, надеюсь, узнать, что это такое.
Использование: Blazor Server, .NET 3.1