6

Właśnie utworzyłem formant użytkownika. Ta kontrolka używa także mojej statycznej klasy Entity Framework do załadowania dwóch comboboxów. Wszystko jest dobrze i działa bez problemu. Projekt i środowisko wykonawcze działają. Następnie, po zatrzymaniu aplikacji, wszystkie formularze, które zawierają mój UserControl, nie działają już w czasie projektowania. Właśnie widzę dwa błędy:EF w UserControl nie widać app.config?

Błąd 1: Określone nazwane połączenie nie znajduje się w konfiguracji, nie jest przeznaczone do użycia z dostawcą EntityClient lub jest niepoprawne.

Błąd 2: Zmienna ccArtikelVelden jest niezadeklarowana lub nigdy nie została przypisana. (ccArtikelVelde jest mój UserControl)

Runtime wszystko nadal pracuje

Moja statyczna klasa EF Repositoy:

public class BSManagerData 
{ 
    private static BSManagerEntities _entities; 
    public static BSManagerEntities Entities 
    { 
     get 
     { 
      if (_entities == null) 
       _entities = new BSManagerEntities(); 
      return _entities; 
     } 
     set 
     { 
      _entities = value; 
     } 
    } 
} 

Niektóre logika dzieje w moim UserControl aby załadować dane w comboboxes:

private void LaadCbx() 
{ 
    cbxCategorie.DataSource = (from c in BSManagerData.Entities.Categories 
           select c).ToList(); 
    cbxCategorie.DisplayMember = "Naam"; 
    cbxCategorie.ValueMember = "Id"; 
} 

private void cbxCategorie_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    cbxFabrikant.DataSource = from f in BSManagerData.Entities.Fabrikants 
           where f.Categorie.Id == ((Categorie)cbxCategorie.SelectedItem).Id 
           select f; 
    cbxFabrikant.DisplayMember = "Naam"; 
    cbxFabrikant.ValueMember = "Id"; 
} 

Jedynym sposobem, aby moje formularze znów działały, czas projektowania, jest komentowanie części EF w UserControl (patrz wyżej) i odbudować. To bardzo dziwne, wszystko jest w tym samym zespole, tej samej przestrzeni nazw (ze względu na prostotę).

Masz pomysł?

+2

Zatrzymałem czytanie, gdy tylko przeczytałem słowa "statyczna klasa obiektu Entity". Przestań to robić. Teraz. "ObjectContext" nie jest przeznaczony do tego celu. – Aaronaught

Odpowiedz

8

Wygląda na to, że wykonujesz kod bazy danych w trybie projektowania. Aby temu zapobiec, dopaść kontrolę i metody przyczyną tego, i użyć:

if (DesignMode) 
    return 

Ponadto, jest to bardzo zły pomysł, aby buforować kontekstu bazy danych statycznie. Spowoduje to problemy z wielowątkowością, a także podczas wstawiania i usuwania. Kontekst bazy danych jest przeznaczony do użycia w pojedynczej "jednostce pracy", dodaje 2 i usuwa 3 inne obiekty i wywołuje jeden raz.

+0

Dziękuję za twoje odpowiedzi Jestem za najlepszą praktyką i jeśli używanie klasy statycznej jest złą praktyką, muszę zobaczyć, jak powinienem to zrobić w inny sposób. Problem polega na tym, że pewnego razu dostałem błąd, gdy nie mogłem edytować obiektu z innego kontekstu. Czytałem w StackOverflow, że tworzenie klasy statycznej było jednym z rozwiązań. Dlatego poszłam na takie podejście. Nie jestem też wielkim fanem za każdym razem, gdy potrzebuję uzyskać dostęp do bazy danych, zbudować instrukcję użycia wokół mojej operacji. Jestem nowy w EF, więc wszelkie konstruktywne porady są mile widziane! – Sven

+0

Próbowałem tylko tego, co zaproponowałeś, ale nadal nie było dobrze. Teraz zrobiłem co następuje: prywatna pustka LaadCbx() { jeśli (DesignMode) powrócić; cbxCategorie.DataSource = (z c w BSManagerData.Entities.Categories wybierz c) .ToList(); cbxCategorie.DisplayMember = "Naam"; cbxCategorie.ValueMember = "Id"; } Jednak gdy próbuję dodać formant do mojego formularza, pojawia się następujący błąd: http://img716.imageshack.us/img716/6549/eferror.png – Sven

+0

Skąd dzwonisz LaadCbx()? Jeśli wywołujesz go z konstruktora, spróbuj usunąć go z konstruktora kontrolki. Lepiej (nie tylko w tym przypadku, ale ogólnie) zrobić jak najmniej w konstruktorze, a zwłaszcza w połączeniach DB. Powinieneś być w stanie użyć haka, takiego jak OnLoad, aby załadować dane. –

2

I w obliczu tego samego problemu,

W moim przypadku, dodałem kilka kodów bazy danych w przypadku załadunku sterowania użytkownika, które zostały z wykorzystaniem niektórych bibliotek, które nie zostały załadowane do wykonywania.

Dlatego zaleca się, aby nie zapisywać żadnego kodu bazy danych w zdarzeniu ładowania kontroli użytkownika.

Mam nadzieję, że to pomoże!

+0

Dziękuję, człowieku! Właśnie spędziłem 3 godziny, próbując zrozumieć, co robię źle. Próbowałem odtworzyć model encji, stworzyłem kilka rozwiązań testowych ... A odpowiedź była prosta: NIE Wpisywać kodu BAZY DANYCH W KONTROLI UŻYTKOWNIKA KONTROLI OBCIĄŻENIA! –

0

ten błąd pojawia się, jeśli wywołasz funkcję "LaadCbx()" na konstruktorze userControl.

ponieważ inicjalizacja w strukturze encji istnieje w tej funkcji.

rozwiązaniem jest wywołanie tej funkcji "LaadCbx()" w konstruktorze formularza nadrzędnego.

Powiązane problemy