Blazor Server и Entity Framework. Как избежать нескольких конфликтующих звонков в БД - PullRequest
0 голосов
/ 31 октября 2019

Сводка

На моей странице 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

1 Ответ

1 голос
/ 13 ноября 2019

Окончательное решение было:

Страница бритвы

@inherits OwningComponentBase<Data.MyService>

Запуск

services.AddDbContext<MyContext>();
services.AddScoped<MyService>();

Для получения более подробной информации,см .: Использование Entity Framework Core с Blazor # 10448

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...