Piszę kod dostępu do bazy danych za pomocą EntityFrameWork. Kod jest następujący:Dlaczego potrzebuję funkcji ToList(), aby uniknąć zbędnych błędów kontekstu?
public IEnumerable<Rows> GetRows(int id)
{
using (var context = new ApplicationDbContext())
{
var repository = new EntityFrameWorkRepository<int, RowEntity>(context);
//need a ToList() here to prevent disposed dbcontext errors
return repository.GetRowsFromDb(id).ToList();
}
}
GetRowsFromDb() używa LINQ do wysyłania zapytań do bazy danych i filtrowania wyników za pomocą id.
Oryginalnie napisałem powyższą metodę bez wywoływania ToList(), ale kiedy próbowałem uzyskać dostęp do obiektów w IEnumerable, który został zwrócony, uzyskałbym wyjątek dotyczący już usuniętego dbcontext. Nie rozumiem, jak powyższy kod naprawia pewne rzeczy, mimo że działa. Zakładam, że ToList() głęboko kopiuje obiekt i może to zapewnia wymaganą separację od kontekstu/bazy danych, ale z pewnością oryginalny obiekt powinien być użyteczny?
'IEnumerables' są leniwy, więc kontekst zostanie usunięty zanim jakiekolwiek wyniki zostaną pobrane w metodzie wywołania. 'ToList' sprawia, że rzeczy są chętne. – Lee
Wyszukaj "LINQ deffered execution" – MarcinJuraszek
Losowo powiązane: http://stackoverflow.com/questions/27491762/creating-a-plan-repository- but-using-keyword-in-constructor-body/27491794#27491794 – BradleyDotNET