Reputation: 1925
I have an ASP.Net Core application that uses EF Core.
I use ASP.Net Identity and share the same DBContext for my app's entities.
I have set my connection string to an Azure SQL database to have MultipleActiveResultSet=True.
It works for a day or two, but eventually it fails with the error:
The connection does not support MultipleActiveResultSets.
I don't think MARS is the real issue since it worked for the first two days it was up.
I am using ASP.Net Core's built-in DI to set my DbContext.
services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(appDbContextConnectionString));
My understanding is that the default lifetime for the DbContext above is Transient (per web request).
Is it alright to share the same DBContext with ASP.Net Identity or should I have a separate one for my app's entities, pointed to the same DB?
I don't know if this is an issue with EF Core, ASP.Net Core or with SQL Azure configuration.
Upvotes: 30
Views: 24230
Reputation: 67
MultipleActiveResultSets=True
need to add in connection string.
string connectionString = "Data Source=MSSQL1;Initial Catalog=AdventureWorks;Integrated Security=SSPI;MultipleActiveResultSets=True";
Upvotes: 5
Reputation: 5381
Multiple Active Result Sets (MARS) is a feature that works with SQL Server to allow the execution of multiple batches on a single connection. When MARS is enabled for use with SQL Server, each command object used adds a session to the connection.
The MARS feature is disabled by default.
You can enable it like below.
string connectionString = "Data Source=MSSQL1;" +
"Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +
"MultipleActiveResultSets=True";
Special Considerations When Using MARS
Upvotes: 2
Reputation: 1652
I had a similar issue and I found that the problem was that I missed an await statement in front of my method.
FetchStuffFromDBAsync();
Became:
await FetchStuffFromDBAsync();
And the problem was gone.
Upvotes: 16
Reputation: 181
Remove "Connection Timeout" setting from your connection string.
Upvotes: -1
Reputation: 191
I kept running into this issue too, and setting MultipleActiveResultSet=True
in the connection string didn't do much.
My db configuration in Startup.cs
is very similar to what you have:
services.AddEntityFrameworkSqlServer()
.AddDbContext<MyDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
builder => builder.MigrationsAssembly("MyProject")),
ServiceLifetime.Transient
);
It turned out that I was getting
The connection does not support MultipleActiveResultSets
because I had several async db queries accessing the same entities. So one db query would retrieve an entity, and a second would have included the same entity through EF Core's new Include
method. Also see https://stackoverflow.com/a/46164203/4336725
The reason I had several async db queries was because EF Core does not currently support lazy loading (unlike EF 6). https://github.com/aspnet/EntityFrameworkCore/issues/3797
My workaround was to define several IQueryable
s with different explicit Include()
and ThenInclude()
.
Upvotes: 1