2017-09-04 1 views
11

Ich habe eine ASP.Net Core-Anwendung, die EF Core verwendet.Intermittierender Fehler mit EF Core: Die Verbindung unterstützt MultipleActiveResultSets nicht

Ich benutze ASP.Net Identität und teile den gleichen DBContext für die Entitäten meiner App.

Ich habe meine Verbindungszeichenfolge zu einer Azure SQL-Datenbank festgelegt, um MultipleActiveResultSet = True zu haben.

Es funktioniert für einen Tag oder zwei, aber schließlich scheitert es mit dem Fehler:

The connection does not support MultipleActiveResultSets.

Ich glaube nicht, MARS das eigentliche Problem ist, da es für die ersten zwei Tage arbeitete er bis war.

Ich verwende ASP.Net Core integrierte DI, um meinen DbContext zu setzen.

Mein Verständnis ist, dass die Standardlebensdauer für den obigen DbContext Transient (pro Webanforderung) ist.

Ist es in Ordnung, denselben DBContext mit ASP.Net Identity zu teilen, oder sollte ich einen separaten für die Entitäten meiner App haben, der auf die gleiche DB verweist?

Ich weiß nicht, ob dies ein Problem mit EF Core, ASP.Net Core oder mit SQL Azure-Konfiguration ist.

+0

https://github.com/aspnet/EntityFrameworkCore/issues/6491 Was meint er mit "Hat die Middleware einen Umfang pro Anfrage?" –

+0

können Sie den Code teilen, in dem Sie Ihren db-Kontext injizieren oder erstellen? – hugoterelle

+3

Sie können überprüfen, ob Ihre Verbindungszeichenfolge mit "MultipleActiveResultSet = True" tatsächlich zur Laufzeit verwendet wird. Nur eine Vermutung. https://stackoverflow.com/questions/12690453/sql-azure-getting-an-error-there-ist-ready-an-open-datareader-associated-wit –

Antwort

0

Ich lief auch in diesem Problem, und Einstellung MultipleActiveResultSet=True in der Verbindungszeichenfolge hat nicht viel getan.

Meine db Konfiguration in Startup.cs ist sehr ähnlich zu dem, was Sie haben:

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

Es stellte sich heraus, dass ich

The connection does not support MultipleActiveResultSets

bekommen, weil ich die gleichen Einheiten mehrere async db Abfragen hatten Zugriff. Eine Datenbankabfrage würde also eine Entität abrufen, und eine zweite hätte die gleiche Entität über die neue Include-Methode von EF Core aufgenommen. Siehe auch https://stackoverflow.com/a/46164203/4336725

Der Grund, warum ich mehrere asynchrone DB-Abfragen hatte, war, dass EF Core derzeit kein Lazy-Laden unterstützt (im Gegensatz zu EF 6). https://github.com/aspnet/EntityFrameworkCore/issues/3797

war meine Abhilfe mehr IQueryable s mit verschiedenen expliziten Include() und ThenInclude() zu definieren.