Вторая операция была запущена в этом экземпляре контекста до завершения предыдущей операции в решении микросервиса.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Вторая операция была запущена в этом экземпляре контекста до завершения предыдущей операции в решении микросервиса.

Сообщение Anonymous »

Я работаю над микросервисным решением, включающим более 20 сервисов.
Каждый сервис использует Entity Framework и SQL.
У меня есть CrudService, который реализует стандартные операции с базой данных:

Код: Выделить всё

public class CrudService : ICrudService where TEntity : class
{
private readonly DbContext _context;
private readonly DbSet _entity;

public CrudService(DbContext context)
{
_context = context;
_entity = context.Set();
}

public virtual IQueryable GetAll() =>
_entity;

....
}
Как вы можете видеть, DbContext внедряется в эту службу.
Я зарегистрировал это с помощью стандартного DI-контейнера, который является частью службы Windows. приложение.

Код: Выделить всё

var connectionString = configuration.GetConnectionString("connection");
services.AddDbContextPool(options =>
{
options.UseSqlServer(connectionString);
}, ServiceLifetime.Transient);

services.AddTransient();
services.AddTransient(typeof(ICrudService), typeof(CrudService));
services.AddTransient();
Микросервисы взаимодействуют через RabbitMQ с использованием EasyNetQ.
У меня есть обработчики запросов/ответов, которые используют ICrudService, примерно так:

Код: Выделить всё

public class Handler : IResponder
{
private readonly ICrudService _crudService;

public Handler(ICrudService crudService)
{
_crudService = crudService;
}

public async Task CreateResponseAsync(Request request)
{
var results = await _crudService.GetAll()
.ToListAsync();

return ...
}
}
Однако, когда службы заняты, я получаю эту ошибку:

System.InvalidOperationException: была выполнена вторая операция началось
в этом экземпляре контекста до завершения предыдущей операции. Это
обычно вызвано тем, что разные потоки одновременно используют один и тот же
экземпляр DbContext. Для получения дополнительной информации о том, как избежать проблем с потоками
с помощью DbContext

Я пытался изменить регистрацию DI на Scoped, но безуспешно
Я также пытался внедрить службы IServiceProvider в свой обработчик, но безуспешно.
например,

Код: Выделить всё

public Handler(IServiceProvider services)
{
_services = services ?? throw new ArgumentNullException(nameof(services));
}

public async Task CreateResponseAsync(Request request)
{
using var scope = _services.CreateScope();

var crudService = scope.ServiceProvider.GetRequiredService

Подробнее здесь: [url]https://stackoverflow.com/questions/79019354/a-second-operation-was-started-on-this-context-instance-before-a-previous-operat[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»