Ответ 1
MultipleActiveResultSets = True необходимо добавить в строку подключения.
string connectionString = "Источник данных = MSSQL1; Начальный каталог = AdventureWorks; Интегрированная безопасность = SSPI; MultipleActiveResultSets = True";
У меня есть приложение 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.
MultipleActiveResultSets = True необходимо добавить в строку подключения.
string connectionString = "Источник данных = MSSQL1; Начальный каталог = AdventureWorks; Интегрированная безопасность = SSPI; MultipleActiveResultSets = True";
У меня была похожая проблема, и я обнаружил, что проблема в том, что я пропустил ожидание перед моим методом.
FetchStuffFromDBAsync();
Стала:
await FetchStuffFromDBAsync();
И проблема исчезла.
Я продолжал сталкиваться с этой проблемой, и установка 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()
.
Удалите параметр "Время ожидания подключения" из строки подключения.
Множественные активные наборы результатов (MARS) - это функция, которая работает с SQL Сервер, позволяющий выполнять несколько пакетов на одном подключение. Когда MARS включен для использования с SQL Server, каждая команда Используемый объект добавляет сеанс к соединению.
Функция MARS отключена по умолчанию.
Вы можете включить его, как показано ниже.
string connectionString = "Data Source=MSSQL1;" +
"Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +
"MultipleActiveResultSets=True";