Прерывистая ошибка с EF Core: соединение не поддерживает MultipleActiveResultSets

У меня есть приложение ASP.Net Core, которое использует EF Core.

Я использую идентификатор ASP.Net и передаю один и тот же DBC-текст для своих объектов приложения.

Я установил строку подключения в базу данных Azure SQL, чтобы иметь MultipleActiveResultSet = True.

Он работает в течение дня или двух, но в итоге он терпит неудачу с ошибкой:

Соединение не поддерживает MultipleActiveResultSets.

Я не думаю, что MARS - это настоящая проблема, так как она работала в течение первых двух дней, когда она была.

Я использую встроенный DI-код ASP.Net Core для установки моего DbContext.

services.AddDbContext<AppDbContext>(options =>
  options.UseSqlServer(appDbContextConnectionString));

Я понимаю, что время жизни по умолчанию для DbContext выше - Transient (для каждого веб-запроса).

Можно ли использовать один и тот же DBC-текст с идентификатором ASP.Net или иметь отдельный объект для моих объектов приложения, указав на тот же БД?

Я не знаю, если это проблема с EF Core, ASP.Net Core или с конфигурацией SQL Azure.

Ответ 1

MultipleActiveResultSets = True необходимо добавить в строку подключения.

string connectionString = "Источник данных = MSSQL1; Начальный каталог = AdventureWorks; Интегрированная безопасность = SSPI; MultipleActiveResultSets = True";

Ответ 2

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

FetchStuffFromDBAsync();

Стала:

await FetchStuffFromDBAsync();

И проблема исчезла.

Ответ 3

Я продолжал сталкиваться с этой проблемой, и установка MultipleActiveResultSet=True в строке подключения не помогла.

Моя конфигурация db в Startup.cs очень похожа на то, что у вас есть:

 services.AddEntityFrameworkSqlServer()
         .AddDbContext<MyDbContext>(options =>
           options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
            builder => builder.MigrationsAssembly("MyProject")),
            ServiceLifetime.Transient
         );

Оказалось, что я получаю

Соединение не поддерживает MultipleActiveResultSets

потому что у меня было несколько запросов async db, обращающихся к тем же объектам. Таким образом, один запрос db будет извлекать объект, а второй будет включать один и тот же объект через новый метод EF Core Include. Также см. fooobar.com/questions/505496/...

Причина, по которой у меня было несколько запросов async db, заключалась в том, что EF Core в настоящее время не поддерживает ленивую загрузку (в отличие от EF 6). https://github.com/aspnet/EntityFrameworkCore/issues/3797

Мое обходное решение состояло в том, чтобы определить несколько IQueryable с разными явными Include() и ThenInclude().

Ответ 4

Удалите параметр "Время ожидания подключения" из строки подключения.

Ответ 5

  Множественные активные наборы результатов (MARS) - это функция, которая работает с SQL Сервер, позволяющий выполнять несколько пакетов на одном подключение. Когда MARS включен для использования с SQL Server, каждая команда Используемый объект добавляет сеанс к соединению.

Функция MARS отключена по умолчанию.

Вы можете включить его, как показано ниже.

string connectionString = "Data Source=MSSQL1;" +   
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +  
    "MultipleActiveResultSets=True";  

Особые замечания при использовании MARS