Mam to zapytanie i pojawia się błąd w tej funkcji:
var accounts = from account in context.Accounts
from guranteer in account.Gurantors
select new AccountsReport
{
CreditRegistryId = account.CreditRegistryId,
AccountNumber = account.AccountNo,
DateOpened = account.DateOpened,
};
return accounts.AsEnumerable()
.Select((account, index) => new AccountsReport()
{
RecordNumber = FormattedRowNumber(account, index + 1),
CreditRegistryId = account.CreditRegistryId,
DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber),
AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)
})
.OrderBy(c=>c.FormattedRecordNumber)
.ThenByDescending(c => c.StateChangeDate);
public DateTime DateLastUpdated(long creditorRegistryId, string accountNo)
{
return (from h in context.AccountHistory
where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo
select h.LastUpdated).Max();
}
Błąd to:
Z tym poleceniem jest już otwarty czytnik danych, który należy najpierw zamknąć.
Aktualizacja:
dodano ślad stosu:
InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.]
System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) +5008639
System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) +23
System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) +144
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +87
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +10
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +443
[EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.]
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +479
System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute(ObjectContext context, ObjectParameterCollection parameterValues) +683
System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +119
System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +38
System.Linq.Enumerable.Single(IEnumerable`1 source) +114
System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3(IEnumerable`1 sequence) +4
System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable`1 query, Expression queryRoot) +29
System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(Expression expression) +91
System.Data.Entity.Internal.Linq.DbQueryProvider.Execute(Expression expression) +69
System.Linq.Queryable.Max(IQueryable`1 source) +216
CreditRegistry.Repositories.CreditRegistryRepository.DateLastUpdated(Int64 creditorRegistryId, String accountNo) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1497
CreditRegistry.Repositories.CreditRegistryRepository.<AccountDetails>b__88(AccountsReport account, Int32 index) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1250
System.Linq.<SelectIterator>d__7`2.MoveNext() +198
System.Linq.Buffer`1..ctor(IEnumerable`1 source) +217
System.Linq.<GetEnumerator>d__0.MoveNext() +96
c#
entity-framework
entity-framework-4
DotnetSparrow
źródło
źródło
Możesz użyć
ToList()
metody przedreturn
instrukcją.źródło
Total = storeDb.OF_Carts.Where(x => x.CartId == ShoppingCartId).ToList().Sum(t => t.Quantity * t.Item.UnitPrice);
użyj składni,
.ToList()
aby przekonwertować obiekt odczytany z bazy danych na listę, aby uniknąć ponownego odczytu. Mam nadzieję, że to zadziała. Dzięki.źródło
Oto działający ciąg połączenia dla kogoś, kto potrzebuje referencji.
źródło
W moim przypadku użycie
Include()
rozwiązanego tego błędu i w zależności od sytuacji może być o wiele bardziej wydajne niż wydawanie wielu zapytań, gdy wszystkie mogą być odpytywane jednocześnie za pomocą sprzężenia.źródło
Nie wiem, czy to jest duplikat odpowiedzi, czy nie. Jeśli tak, przepraszam. Chcę tylko powiadomić potrzebujących, jak rozwiązałem problem za pomocą ToList ().
W moim przypadku dostałem ten sam wyjątek dla poniższego zapytania.
Rozwiązałem jak poniżej
źródło
Wygląda na to, że wywołujesz DateLastUpdated z aktywnego zapytania przy użyciu tego samego kontekstu EF, a DateLastUpdate wydaje polecenie do samego magazynu danych. Entity Framework obsługuje tylko jedno aktywne polecenie na kontekst jednocześnie.
Możesz zmienić powyższe dwa zapytania w jedno takie jak to:
Zauważyłem również, że w zapytaniach wywołujesz funkcje takie jak FormattedAccountNumber i FormattedRecordNumber. O ile nie są przechowywane procy lub funkcje zaimportowane z bazy danych do modelu danych encji i poprawnie odwzorowane, będą one również generować wyjątki, ponieważ EF nie będzie wiedział, jak przełożyć te funkcje na instrukcje, które może wysłać do magazynu danych.
Zauważ też, że wywołanie AsEnumerable nie wymusza wykonania zapytania. Do momentu odroczenia wykonania zapytania do czasu wyliczenia. Jeśli chcesz, możesz wymusić wyliczenie za pomocą ToList lub ToArray.
źródło
Oprócz odpowiedzi Ladislava Mrnki :
Jeśli publikujesz i zastępujesz kontener na karcie Ustawienia , możesz ustawić MultipleActiveResultSet na True. Możesz znaleźć tę opcję, klikając Zaawansowane ... i będzie ona w grupie Zaawansowane .
źródło
Dla tych, którzy znajdą to za pośrednictwem Google;
Otrzymywałem ten błąd, ponieważ, jak sugeruje błąd, nie udało mi się zamknąć SqlDataReader przed utworzeniem kolejnego w tym samym SqlCommand, błędnie zakładając, że będzie to śmieci wyrzucane podczas opuszczania metody, w której został utworzony.
Rozwiązałem problem, dzwoniąc
sqlDataReader.Close();
przed utworzeniem drugiego czytnika.źródło
W moim przypadku otworzyłem zapytanie z kontekstu danych, np
... a następnie zapytał o to samo ...
Dodanie
.ToList
do pierwszego rozwiązało mój problem. Myślę, że warto zawinąć to we właściwość taką jak:Gdzie _stores jest zmienną prywatną, a Filters jest również właściwością tylko do odczytu, która czyta z AppSettings.
źródło
Miałem ten sam błąd, gdy próbowałem zaktualizować niektóre rekordy w pętli odczytu. Wypróbowałem najczęściej głosowaną odpowiedź
MultipleActiveResultSets=true
i stwierdziłem, że jest to obejście problemu, aby uzyskać następny błądNajlepszym podejściem, które zadziała w przypadku ogromnych zestawów wyników, jest użycie porcji i otwarcie osobnego kontekstu dla każdej porcji, jak opisano w SqlException from Entity Framework - Nowa transakcja jest niedozwolona, ponieważ w sesji działają inne wątki
źródło
Rozwiązałem ten problem, zmieniając oczekiwanie _accountSessionDataModel.SaveChangesAsync (); to _accountSessionDataModel.SaveChanges (); w mojej klasie Repository.
Zmieniono na:
Problem polegał na tym, że zaktualizowałem sesje w interfejsie użytkownika po utworzeniu sesji (w kodzie), ale ponieważ SaveChangesAsync odbywa się asynchronicznie, pobieranie sesji spowodowało ten błąd, ponieważ najwyraźniej operacja SaveChangesAsync nie była jeszcze gotowa.
źródło
Dla mnie to był mój własny błąd. Próbowałem uruchomić
INSERT
używającSqlCommand.executeReader()
kiedy powinienem był używanySqlCommand.ExecuteNonQuery()
. Został otwarty i nigdy nie został zamknięty, co spowodowało błąd. Uważaj na ten nadzór.źródło
Wyodrębniono to ze scenariusza ze świata rzeczywistego:
Podsumowując, nie zapominając o MultipleActiveResultSets, kod mógł działać przez długi czas przed wykryciem nadmiarowego wywołania db, które może być bardzo kosztowne, i sugeruję, aby nie polegać w pełni na ustawianiu atrybutu MultipleActiveResultSets, ale także dowiedzieć się, dlaczego kod go potrzebuje gdzie się nie udało .
źródło
Najprawdopodobniej ten problem występuje z powodu funkcji „leniwego ładowania” Entity Framework. Zwykle, chyba że jest to wyraźnie wymagane podczas wstępnego pobierania, wszystkie połączone dane (wszystko, co przechowywane w innych tabelach bazy danych) są pobierane tylko wtedy, gdy jest to wymagane. W wielu przypadkach jest to dobra rzecz, ponieważ zapobiega pobieraniu niepotrzebnych danych, a tym samym poprawia wydajność zapytań (brak połączeń) i oszczędza przepustowość.
W sytuacji opisanej w pytaniu wykonywane jest wstępne pobieranie, a podczas fazy „wyboru” żądane jest brakujące opóźnione ładowanie danych, wysyłane są dodatkowe zapytania, a następnie EF narzeka na „otwarty DataReader”.
Obejście zaproponowane w zaakceptowanej odpowiedzi pozwoli na wykonanie tych zapytań i rzeczywiście całe żądanie zakończy się powodzeniem.
Jeśli jednak sprawdzisz żądania wysłane do bazy danych, zauważysz wiele żądań - dodatkowe żądanie dla każdego brakującego (leniwie załadowanego) danych. To może być zabójca wydajności.
Lepszym rozwiązaniem jest poinformowanie EF o wstępnym załadowaniu wszystkich potrzebnych leniwie załadowanych danych podczas pierwszego zapytania. Można to zrobić za pomocą instrukcji „Uwzględnij”:
W ten sposób wszystkie potrzebne sprzężenia zostaną wykonane, a wszystkie potrzebne dane zostaną zwrócone jako pojedyncze zapytanie. Problem opisany w pytaniu zostanie rozwiązany.
źródło
Korzystam z usługi sieci Web w moim narzędziu, z którego usługi pobierają procedurę składowaną. podczas gdy większa liczba narzędzi klienckich pobiera usługę internetową, pojawia się ten problem. Naprawiłem, określając atrybut synchronizowany dla tych funkcji, które pobierają procedurę przechowywaną. teraz działa dobrze, błąd nigdy nie pojawił się w moim narzędziu.
Ten atrybut umożliwia przetwarzanie jednego żądania na raz. więc to rozwiązuje problem.
źródło
Na marginesie ... może się to również zdarzyć, gdy występuje problem z (wewnętrznym) odwzorowaniem danych z obiektów SQL.
Na przykład...
Stworzyłem
SQL Scalar Function
że przypadkowo zwracanaVARCHAR
... a potem ... używali go do wygenerowania kolumny wVIEW
.VIEW
Został prawidłowo odwzorowane wDbContext
... więc LINQ został nazywając go po prostu w porządku. Jednak jednostka oczekiwała DateTime? iVIEW
zwracał String .Który ODDLY rzuca ...
Ciężko było to rozgryźć ... ale po poprawieniu parametrów zwrotu ... wszystko było dobrze
źródło
W moim przypadku musiałem ustawić
MultipleActiveResultSets
toTrue
w ciągu połączenia.Potem pojawił się kolejny błąd (prawdziwy) dotyczący niemożności uruchomienia 2 poleceń SQL w tym samym czasie w tym samym kontekście danych! (EF Core, najpierw kod)
. Rozwiązaniem było dla mnie poszukiwanie dowolnego wykonania asynchronicznego polecenia i przełączenie ich w tryb synchroniczny , ponieważ miałem tylko jeden DbContext dla obu poleceń.
Mam nadzieję, że Ci to pomoże
źródło