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.