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.Odpowiedzi:
Znany jest błąd polegający na określaniu domyślnego limitu czasu polecenia w ciągu połączenia EF.
http://bugs.mysql.com/bug.php?id=56806
Usuń wartość z ciągu połączenia i ustaw ją w samym obiekcie kontekstu danych. Działa to, jeśli usuniesz sprzeczną wartość z ciągu połączenia.
Entity Framework Core 1.0:
Entity Framework 6:
Entity Framework 5:
Entity Framework 4 i poniżej:
źródło
this.Database.SetCommandTimeout(180);
Jeśli używasz DbContext, użyj następującego konstruktora, aby ustawić limit czasu komendy:
źródło
DbContext
klasa pochodna została wygenerowana automatycznie zedmx
pliku?Jeśli używasz
DbContext
i EF v6 +, możesz alternatywnie użyć:źródło
Zwykle obsługuję moje operacje w ramach transakcji . Jak się przekonałem, nie wystarczy ustawić limit czasu polecenia kontekstu, ale transakcja wymaga konstruktora z parametrem limitu czasu. Musiałem ustawić obie wartości limitu czasu, aby działało poprawnie.
Pod koniec funkcji ustawiłem limit czasu komendy na poprzednią wartość w prevto.
Korzystanie z EF6
źródło
Wiem, że działa to bardzo stary wątek, ale EF jeszcze tego nie naprawił. W przypadku osób korzystających z automatycznego generowania
DbContext
można użyć następującego kodu, aby ręcznie ustawić limit czasu.źródło
Jeśli używasz Entity Framework jak ja, powinieneś zdefiniować Limit czasu w klasie Autostart w następujący sposób:
źródło
Właśnie to sfinansowałem. Może to komuś pomoże:
Więc zaczynamy:
Jeśli używasz LINQ z EF, szukając pewnych dokładnych elementów zawartych na liście, takich jak to:
wszystko idzie dobrze, dopóki lista nie zawiera więcej niż jednego identyfikatora.
Problem „przekroczenia limitu czasu” pojawia się, jeśli lista zawiera tylko jeden identyfikator. Aby rozwiązać problem, użyj warunku, aby sprawdzić liczbę identyfikatorów w IdList.
Przykład:
Wyjaśnienie:
Po prostu spróbuj użyć Sql Profiler i sprawdź instrukcję Select wygenerowaną przez element Ente frameeork. …
źródło