Проблема с многопоточностью в DbContext в архитектуре Blazor + CQRS - PullRequest
0 голосов
/ 20 апреля 2020

Я сталкиваюсь со знаменитой ошибкой "В этом контексте запущена вторая операция до того, как предыдущая операция завершена" в моем проекте.

Я знаю причину, по которой это происходит, потому что я вызываю тот же метод ( GetPersons()) на странице Razor, чтобы загрузить четыре ComboBox. Вот моя инфраструктура / data-> context:

public class PlaygroundBiRepository : IPlaygroundBiRepository
{

    private readonly PlaygroundBiContext _context;

    public PlaygroundBiRepository(PlaygroundBiContext context) => _context = context;

    #region Person

    public async Task<Person> GetPersonByIdAsync(int id) => await _context.Persons.FindAsync(id);
    public IQueryable<Person> GetPersons() => _context.Persons;
    public async Task<PersonRole> GetPersonRoleByIdAsync(int id) => await _context.PersonRoles.FindAsync(id);

    public IQueryable<PersonRole> GetPersonRoles() => _context.PersonRoles;
    public async Task<Role> GetRoleByIdAsync(int id) => await _context.Roles.FindAsync(id);
    public IQueryable<Role> GetRoles() => _context.Roles;

    # endregion
}

После прочтения кое-где я не вижу простого решения этой проблемы. Мне придется потерять DI в контексте, если я хочу использовать новый каждый вызов.

ServiceLifetime.Transient не работает, и цепочка вызовов не async

Любые указатели, пожалуйста.

1 Ответ

1 голос
/ 20 апреля 2020

исключение, похоже, что один и тот же экземпляр контекста или один и тот же DbConnection могут использоваться одновременно несколькими потоками. Однако это только предположение.

У меня была похожая проблема, и она была вызвана AddDbContextPool, после изменения на AddDbContext она разрешена

...