Ich erhalte Timeouts bei der Verwendung von Entity Framework (EF), wenn ich einen Funktionsimport verwende, der über 30 Sekunden dauert. Ich habe Folgendes versucht und konnte dieses Problem nicht lösen:
Ich fügte hinzu Default Command Timeout=300000
an die Verbindungszeichenfolge in der Datei App.Config Datei in dem Projekt, das die EDMX-Datei enthält, wie vorgeschlagen aquí .
So sieht mein Verbindungsstring 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, den CommandTimeout in meinem Repository direkt wie folgt zu setzen:
private TrekEntities context = new TrekEntities();
public IEnumerable<TrekMatches> GetKirksFriends()
{
this.context.CommandTimeout = 180;
return this.context.GetKirksFriends();
}
Was kann ich sonst noch tun, um das EF aus der Zeit zu bringen? Das passiert nur bei sehr großen Datensätzen. Bei kleinen Datensätzen funktioniert alles einwandfrei.
Hier ist eine der Fehlermeldungen, die ich erhalte:
System.Data.EntityCommandExecutionException: Bei der Ausführung der Befehlsdefinition ist ein Fehler aufgetreten. Siehe die innere Ausnahme für Details. ---> System.Data.SqlClient.SqlException: Zeitüberschreitung abgelaufen. Die Timeout-Periode ist vor dem Abschluss des Vorgangs abgelaufen, oder der Server antwortet nicht.
OK - ich habe das zum Laufen gebracht und es ist dumm, was passiert ist. Ich hatte sowohl die Verbindungszeichenfolge mit Default Command Timeout=300000
und das CommandTimeout auf 180 gesetzt. Als ich die Default Command Timeout
aus dem Verbindungsstring zu entfernen, hat es funktioniert. Die Antwort ist also, den CommandTimeout manuell in Ihrem Repository auf Ihrem Kontextobjekt wie folgt zu setzen:
this.context.CommandTimeout = 180;
Offenbar hat das Setzen der Timeout-Einstellungen in der Verbindungszeichenfolge keine Auswirkung darauf.