2011-02-08 10 views
16

Korzystam z Entity Framework i niedawno zdałem sobie sprawę z zalet posiadania modelu EF w innym projekcie w ramach tego samego rozwiązania, dzięki czemu mogę z niego tworzyć wiele interfejsów.Przenoszenie modelu Entity Framework do biblioteki klas z projektu WWW

Przenieśliłem to do nowego projektu biblioteki klas i zaktualizowałem wszystkie odniesienia do elementów w projekcie internetowym, aby użyć nowej biblioteki dll wygenerowanej przez projekt. Wszystko poszło gładko, z wyjątkiem jednego małego szkopułu. Kiedy przeniosłem EF do nowego projektu, w jakiś sposób wciąż czytałem jego ciąg połączenia z web.config w projekcie sieciowym (nie pytaj mnie, ponieważ nie mam pojęcia).

Użyłem "Aktualizuj model z bazy danych" w projektancie EF i nie znaleziono ciągu połączenia (jak się spodziewałem po przeniesieniu go do nowego projektu), więc użyłem kreatora do wygenerowania nowego ciągu połączenia, który wszystko było w porządku. Nowy ciąg połączenia znajduje się teraz w App.config w projekcie biblioteki klas. Ciąg połączenia w oknie właściwości jest teraz poprawny, a projektant czyta go z App.Config. Poszedłem dalej i usunąłem ciąg połączenia z Web.Config w projekcie internetowym.

Teraz po uruchomieniu aplikacji pojawia się następujący błąd:

The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid.

Gdybym wklej ciąg połączenia z powrotem do web.config to wszystko działa dobrze. Nie chcę tworzyć nowego modelu EF od zera, ponieważ jest to dość skomplikowany model i przeprowadziłem wiele restrukturyzacji po wycofaniu z DB. Przelałem wygenerowany plik CS, a także plik XML w pliku edmx i nie mogę znaleźć niczego przydatnego. Każda pomoc jest doceniana. Oczywiście na razie, dopóki nie zrozumiem tego, po prostu zostawiam ciąg połączenia w web.config, ponieważ z jakiegoś powodu wydaje się, że działa.

Odpowiedz

20

Jest to zgodne z projektem; podczas gdy plik konfiguracyjny w bibliotece klas jest tym, czego projektant użyje, plik konfiguracyjny rzeczywistej aplikacji zostanie wykorzystany w środowisku wykonawczym. Niezależnie od tego, czy jest to plik Web.config dla projektu ASP.NET, czy App.config dla projektu WinForm lub WPF, jest to plik konfiguracyjny aplikacji (lub coś wyżej, np. Machine.config), który będzie używany; plik w bibliotece klas nie jest częścią aplikacji.

Jeśli próbujesz podać model EF, który będzie działał bez konieczności podawania ciągu połączenia w aplikacji lub pliku konfiguracyjnym sieci, będziesz musiał przechowywać ciąg połączenia w inny sposób (zawsze możesz -Koduj go) i przekaż go do odpowiedniego przeciążenia konstruktora kontekstu.

Moje rozwiązanie polega na dostarczeniu statycznej funkcji bez parametrów w samym kontekście, która wywołuje to przeciążenie za pomocą odpowiedniego ciągu połączenia.

+3

Czekaj, więc oznacza to, że plik app.config w bibliotece klas jest bezcelowy? Czy biblioteka skompilowana nie powinna mieć dostępu do własnych zasobów? W jaki sposób jest on świadomy web.config w innym projekcie? – Chev

+2

@Chevex: W czasie wykonywania, tak, to bezcelowe. Plik konfiguracyjny nie jest zasobem, jest to po prostu plik konfiguracyjny, który jest częścią projektu. Budowanie projektu nic z tym nie robi. Jest świadomy Web.config, ponieważ używa menedżera konfiguracji .NET, a aplikacja uruchamiająca (w twoim przypadku aplikacja internetowa) kieruje go tam. –

Powiązane problemy