Po wprowadzeniu using w repo wyrzuca "DataContext accessed after Dispose."

0

Witam mam problem ze zrozumieniem oraz z naprawieniem problemu. Najpierw tworzyłem tylko jeden obiekt DataContext w całym repozytorium i nie było problemów ale dla potrzeb testowania repozytorium i odchudzania programu zacząłem tworzyć i niszczyć dataContexty w każdej metodzie repozytorium i tu pojawił się problem z wyjątkiem "DataContext accessed after Dispose."

mój fragment repozytorium wygląda tak:

 
        public IQueryable<Pracownik> GetAll() 
        {
            using (var db = dataContextWrapper.UtworzDataContext())
            {
                return db.Pracownicy().AsQueryable();
            }            
        }

Wszystkie metody repozytorium mam wykonane w ten sam sposób, w głównym oknie ładuje całe DataGridView, dopiero w chwili gdy chce otworzyć okno edycje pojedynczego pracownika program wysypuje mi się podczas próby skonfigurowania ComboBoxa, tak jak pokazuje screen:
user image

I teraz pytania:

1) to źle zaprojektowane repozytorium jest powodem, jeżeli tak to jak je zaprojektować właściwie?
2) czy może źle zaprojektowany w ogóle sposób prezentacji danych? a jeżeli tak to jak to poprawić?
3) dlaczego właściwie ten błąd czepia się właśnie przy ustawianiu ValueMember dla ComboBox'a?
4) jak sprawić aby w testach wyszły tego typu babole? jak pisać testy które by wyłapały takie rzeczy? (zaczynam zgłębiać NUnit i Moq)

2
  1. Tworzenie DataContextu w każdej metodzie niczego nie poprawia. Repozytorium powinno mieć pole typu DataContext z wartością ustawianą przez konstruktor. Metody repozytorium korzystają z tego pola. A sam DataContext jest wstrzykiwany przez kontener IoC, który też zarządza jego czasem życia i disposuje go, gdy zajdzie taka potrzeba.
  2. Nie.
  3. Problem wynika z tego, że warstwa prezentacji wywołuje metodę, która zwraca jedynie abstrakcyjne zapytanie do źródła danych, a nie same dane. Samo odpytanie źródła bazy danych następuje więc już po wykonaniu GetAll, a więc po Dispose, który został automatycznie zawołany przez using. Gdybyś zamienił implementację na return db.Pracownicy().AsQueryable().ToList(); prawdopodobnie problemu by nie było... Tylko po co naraz pobierać wszystkie rekordy z bazy? :)
  4. Testy nie służą do wyłapywania baboli infrastrukturalnych. Użyj IoC i się takimi rzeczami nie przejmuj.

1 użytkowników online, w tym zalogowanych: 0, gości: 1