2013-04-17 6 views
10

Mam następujący kod, który pobiera dane z tabeli klientaentityframework Jest już otwarty DataReader skojarzony z tym poleceniem, które muszą być zamknięte pierwszy

var customers= context.CustomerEntities.Include("Addresses").Select(Mapper.Map).ToList(); 

Funkcja mapowania, odwzorowuje obiekt podmiotu do biznesu obiekt i wygląda na to, że powyższy kod działa dobrze.

Jednak gdy próbuję to zrobić:

var customers= context.CustomerEntities.Select(Mapper.Map).ToList(); 

otrzymuję komunikat o błędzie: There is already an open DataReader associated with this Command which must be closed first gdy funkcja mapowania jest wykonywany.

Teraz jestem świadomy, że aby rozwiązać ten problem, muszę ustawić multipleactiveresultsets=True w ciągu połączenia. Próbowałem, i to rozwiązało mój problem.

Jednak po uruchomieniu narzędzia do profilowania SQL, zapytanie do wszystkich klientów ze struktury encji automatycznie pobrało wszystkie adresy, nawet jeśli ich nie potrzebowałem.

Czy istnieje obejście oprócz konieczności ustawienia multipleactiveresultsets=True? Nie chcę, żeby adresy były leniwie ładowane przez cały czas.

+0

Prawdopodobnie zechcesz sprawdzić swój kod przed swoim przykładem tutaj, założę się, że masz jeszcze aktywny kontekst, zanim twój kod zostanie kiedykolwiek uruchomiony. – Middas

+0

Nie, nie mam innego aktywnego kontekstu –

+0

Dan, możesz być na czymś. pozwól mi to wypróbować. –

Odpowiedz

11

Uważam, że jest tak, ponieważ dla każdego Customer, instrukcja select powoduje przejście i ponowne odczytanie bazy danych. Dlaczego nie zrobić pierwszy ToList() a następnie zastosować Mapping (Select) coś takiego:

var customers= context.CustomerEntities.ToList().Select(Mapper.Map); 

Wierzę, że to przyniesie dane, a potem zrobić mapowanie i nie miałby tego problemu.

+12

Wykonanie tego zmaterializuje całą kolekcję w pamięci, która, jeśli masz do czynienia z dużą ilością danych, jest bardzo złym pomysłem, jeśli możesz tego uniknąć, powinieneś. – Henry

+2

Rewalowano z powodu wymienionego powyżej. –

+2

Nieważne bezcelowe przyjęcie, chyba że masz coś pozytywnego do wniesienia, to jest alternatywa. – JazziJeff

Powiązane problemy