Ich erhalte Zeitüberschreitungen mit dem Entity Framework (EF), wenn ein Funktionsimport verwendet wird, dessen Abschluss mehr als 30 Sekunden dauert. Ich habe Folgendes versucht und konnte dieses Problem nicht beheben:
Ich Default Command Timeout=300000
habe die Verbindungszeichenfolge in der App.Config- Datei in dem Projekt hinzugefügt , das die EDMX-Datei enthält, wie hier vorgeschlagen .
So sieht meine Verbindungszeichenfolge aus:
<add
name="MyEntityConnectionString"
connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|
res://*/MyEntities.msl;
provider=System.Data.SqlClient;provider connection string="
Data Source=trekdevbox;Initial Catalog=StarTrekDatabase;
Persist Security Info=True;User ID=JamesTKirk;Password=IsFriendsWithSpock;
MultipleActiveResultSets=True;Default Command Timeout=300000;""
providerName="System.Data.EntityClient" />
Ich habe versucht, das CommandTimeout in meinem Repository direkt wie folgt festzulegen:
private TrekEntities context = new TrekEntities();
public IEnumerable<TrekMatches> GetKirksFriends()
{
this.context.CommandTimeout = 180;
return this.context.GetKirksFriends();
}
Was kann ich noch tun, um die Zeitüberschreitung der EF zu verhindern? Dies geschieht nur bei sehr großen Datenmengen. Mit kleinen Datensätzen funktioniert alles einwandfrei.
Hier ist einer der Fehler, die ich bekomme:
System.Data.EntityCommandExecutionException: Beim Ausführen der Befehlsdefinition ist ein Fehler aufgetreten. Einzelheiten finden Sie in der inneren Ausnahme. ---> System.Data.SqlClient.SqlException: Zeitüberschreitung abgelaufen. Die Zeitspanne, die vor Abschluss des Vorgangs verstrichen ist oder der Server nicht reagiert.
OK - ich habe das zum Laufen gebracht und es ist albern, was passiert ist. Ich hatte sowohl die Verbindungszeichenfolge mit Default Command Timeout=300000
als auch das CommandTimeout auf 180 gesetzt. Als ich die Default Command Timeout
aus der Verbindungszeichenfolge entfernte, funktionierte es. Die Antwort besteht also darin, das CommandTimeout in Ihrem Repository für Ihr Kontextobjekt wie folgt manuell festzulegen:
this.context.CommandTimeout = 180;
Anscheinend hat das Festlegen der Timeout-Einstellungen in der Verbindungszeichenfolge keine Auswirkungen darauf.
"
in der Zeichenkette.NONCLUSTERED
einigen Tabellen Indizes hinzufügen müssen, wodurch das Timeout-Problem für uns behoben wurde.Antworten:
Es ist ein Fehler beim Festlegen des Standardbefehlszeitlimits in der EF-Verbindungszeichenfolge bekannt.
http://bugs.mysql.com/bug.php?id=56806
Entfernen Sie den Wert aus der Verbindungszeichenfolge und legen Sie ihn für das Datenkontextobjekt selbst fest. Dies funktioniert, wenn Sie den widersprüchlichen Wert aus der Verbindungszeichenfolge entfernen.
Entity Framework Core 1.0:
Entity Framework 6:
Entity Framework 5:
Entity Framework 4 und niedriger:
quelle
this.Database.SetCommandTimeout(180);
Wenn Sie einen DbContext verwenden, verwenden Sie den folgenden Konstruktor, um das Befehlszeitlimit festzulegen:
quelle
DbContext
abgeleitete Klasse automatisch aus eineredmx
Datei generiert wurde ?Wenn Sie
DbContext
EF v6 + verwenden, können Sie alternativ Folgendes verwenden:quelle
Normalerweise erledige ich meine Operationen innerhalb einer Transaktion . Wie ich erfahren habe, reicht es nicht aus, das Zeitlimit für den Kontextbefehl festzulegen, aber die Transaktion benötigt einen Konstruktor mit einem Timeout-Parameter. Ich musste beide Timeout-Werte einstellen, damit es richtig funktioniert.
Am Ende der Funktion habe ich das Befehls-Timeout auf den vorherigen Wert in prevto zurückgesetzt.
Verwenden von EF6
quelle
Ich weiß, dass dies ein sehr alter Thread ist, aber EF hat dies immer noch nicht behoben. Für Benutzer, die automatisch generiert werden,
DbContext
kann der Timeout mithilfe des folgenden Codes manuell festgelegt werden.quelle
Wenn Sie Entity Framework wie ich verwenden, sollten Sie Timeout für die Startup-Klasse wie folgt definieren:
quelle
Das habe ich finanziert. Vielleicht hilft es jemandem:
Auf geht's:
Wenn Sie LINQ mit EF verwenden und nach genauen Elementen suchen, die in der Liste wie folgt enthalten sind:
Alles läuft gut, bis IdList mehr als eine ID enthält.
Das Problem mit dem Zeitlimit tritt auf, wenn die Liste nur eine ID enthält. Um das Problem zu beheben, verwenden Sie die if-Bedingung, um die Anzahl der IDs in IdList zu überprüfen.
Beispiel:
Erläuterung:
Versuchen Sie einfach, SQL Profiler zu verwenden, und überprüfen Sie die von Entity Frameeork generierte Select-Anweisung. …
quelle