Otrzymuję limity czasu przy użyciu Entity Framework (EF), gdy korzystam z importu funkcji, którego ukończenie zajmuje ponad 30 sekund. Próbowałem następujących czynności i nie udało mi się rozwiązać tego problemu:
Dodałem Default Command Timeout=300000
do ciągu połączenia w pliku App.Config w projekcie, który ma plik EDMX, jak sugerowano tutaj .
Tak wygląda mój ciąg połączenia:
<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" />
Próbowałem ustawić CommandTimeout bezpośrednio w moim repozytorium tak:
private TrekEntities context = new TrekEntities();
public IEnumerable<TrekMatches> GetKirksFriends()
{
this.context.CommandTimeout = 180;
return this.context.GetKirksFriends();
}
Co jeszcze mogę zrobić, aby uzyskać limit czasu EF? Dzieje się tak tylko w przypadku bardzo dużych zestawów danych. Wszystko działa dobrze z małymi zestawami danych.
Oto jeden z błędów, które otrzymuję:
System.Data.EntityCommandExecutionException: Wystąpił błąd podczas wykonywania definicji polecenia. Zobacz wewnętrzny wyjątek, aby uzyskać szczegółowe informacje. ---> System.Data.SqlClient.SqlException: Upłynął limit czasu. Limit czasu upłynął przed zakończeniem operacji lub serwer nie odpowiada.
OK - mam to działa i to głupie, co się stało. Miałem zarówno ciąg połączenia z, jak Default Command Timeout=300000
i CommandTimeout ustawione na 180. Gdy usunąłem Default Command Timeout
ciąg połączenia, zadziałało. Zatem odpowiedzią jest ręczne ustawienie CommandTimeout w repozytorium na obiekcie kontekstowym w następujący sposób:
this.context.CommandTimeout = 180;
Najwyraźniej ustawienie limitów czasu w ciągu połączenia nie ma na to wpływu.
"
w ciągu.
NONCLUSTERED
indeksy do niektórych tabel, co rozwiązało problem przekroczenia limitu czasu.