Korzystam z frameworku encji i ASP.NET MVC 4 do budowy aplikacji
Moje rozwiązanie jest podzielone na dwa projekty;
- Biblioteka klas zawierająca plik mojego modelu danych (.edmx) i kilka niestandardowych interfejsów
- Projekt MVC „kontener”, który odwołuje się do biblioteki klas powyżej
Mój problem polega na tym, że podczas próby użycia DbContext „ MyEntites ” pojawia się następujący błąd:
W pliku konfiguracyjnym aplikacji nie można znaleźć ciągu połączenia o nazwie „MyEntities”.
Myślę, że problem ma coś wspólnego z faktem, że parametry połączenia leżą w app.config biblioteki klas, a nie w projekcie MVC.
Czy ktoś ma jakieś sugestie?
PM> Update-Database -Verbose Using StartUp project 'xxxxx.Web.Home'. Using NuGet project 'xxxxx.Web.Home.Dal'. Specify the '-Verbose' flag to view the SQL statements being applied to the target database. Target database is: 'MovieDatabase-0.0.2' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration).
Odpowiedzi:
Spróbuj skopiować ciąg połączeń do pliku .config w projekcie MVC.
źródło
Masz rację, dzieje się tak, ponieważ biblioteka klas (gdzie plik .edmx) nie jest twoim projektem startowym / głównym.
Musisz skopiować parametry połączenia do głównego pliku konfiguracyjnego projektu.
Uwzględnij, że Twój projekt startowy / główny nie ma pliku konfiguracyjnego (tak jak w moim przypadku aplikacji konsoli), po prostu dodaj jeden (Projekt startowy - Dodaj nowy element -> Plik konfiguracji aplikacji).
Bardziej odpowiednie informacje można znaleźć tutaj: MetadataException: Nie można załadować określonego zasobu metadanych
źródło
upewnij się, że wykonałeś projekt (z DbContext) jako start
LUB
Dodaj do projektu ustawionego jako startowy ciąg połączenia w app.config (lub web.config)
LUB
Wywołaj polecenie w ten sposób
Update-Database -Script -ProjectName '<project name>' -StartupProjectName '<project name>' -ConnectionString 'data source=.;initial catalog=<db name>;integrated security=True;MultipleActiveResultSets=True' -ConnectionProviderName 'System.Data.SqlClient'
Następnie spróbuj ponownie
źródło
Set as Startup Project
- jak pokazano na zrzucie ekranu powyżej. (nawet jeśli trafisz F5, nie będziesz w stanie uruchomić biblioteki klas)Możesz po prostu przekazać ciąg połączenia
EntityFramework
i rozpocząć życie:źródło
Jak można się domyślić, ma to związek z ciągiem połączenia znajdującym się w app.config biblioteki klas.
Skopiuj wpis z klasy app.config do kontenera
app.config
lubweb.config
plikuźródło
Jeśli masz wiele projektów w rozwiązaniu, ustaw projekt jako rozpoczęty w miejscu, w którym masz swoją prawdę App.config.
źródło
skopiuj parametry połączenia do
app.config
lubweb.config
pliku w projekcie, który ustawiono na „Ustaw jakoStartUp
projekt”, a jeśli w przypadku użycia struktury encji w projekcie warstwy danych - zainstaluj nuget struktury encji w głównym projekcie.źródło
Dzieje się tak również wtedy, gdy projekt startowy zostanie zmieniony na ten, który nie ma parametrów połączenia .
źródło
Pamiętaj, aby dodać ciągi połączeń po
entityFramework
sekcji:źródło
Tak, to głupie. Można uniknąć kopiowania ciągu połączenia za pomocą narzędzia do tworzenia połączeń. Kod VB.Net (używany w produkcji, ale nieco zmodyfikowany tutaj, więc traktuj go jako nieprzetestowany, chętnie pomożemy w jakichkolwiek problemach), gdzie mam zmienną serverName, zmienną databaseName, przekazuję je do metody i każę, aby wygenerowała połączenie dla mnie:
źródło
czy używasz więcej niż jednego projektu w swoim rozwiązaniu?
Ponieważ jeśli tak, konfiguracja internetowa, którą musisz sprawdzić, dotyczy konfiguracji tego samego projektu, co plik de .edmx
źródło
Dodaj ConnectionString do pliku MVC Project Web.config
źródło
Miałem ten problem, gdy używam wielu proyectów, start proyect z web.config i app.config dla projektu EntityFramework.
Aby uniknąć tego problemu, musisz:
źródło
Napotkałem ten sam problem. Brakowało mi połączenia parametrów połączenia z projektem startowym, ponieważ wykonuję operację dostępu do danych z innej warstwy. także jeśli nie masz app.config w swoim projekcie startowym, dodaj plik app.config, a następnie dodaj ciąg połączenia do tego pliku konfiguracyjnego.
źródło
Dostałem to, nie ustawiając projektu jako startu, jak wskazano w innej odpowiedzi. Mój wkład w to - podczas wykonywania migracji dodatków i aktualizacji bazy danych określ projekt startowy jako część polecenia w konsoli menedżera pakietów Nuget (nie dołączaj znaków „[” lub „]”, aby pokazać, że musisz zmienić znajdujący się tam tekst na nazwę projektu):
Że należy to zrobić.
źródło
Jest tak, ponieważ twoja klasa kontekstu jest dziedziczona z DbContext. Myślę, że twój ctor jest taki:
name=...
należy zmienić na nazwę połączeniaStringźródło
Ciąg połączenia wygenerowany przez projekt zawierający plik .edmx generuje ciąg połączenia, wydaje się, że jest to przechowanie z plików app.config, które zostały skopiowane do katalogu wyjściowego i do których odwołuje się plik wykonywalny do przechowywania informacji o konfiguracji środowiska wykonawczego.
Uszkadza to projekt internetowy, ponieważ nie ma automatycznego procesu dodawania losowych informacji .config do pliku web.config dla projektu internetowego.
Najłatwiej jest skopiować ciąg połączenia z pliku konfiguracyjnego do sekcji połączeń pliku web.config i zignorować zawartość pliku konfiguracyjnego.
źródło
Najlepszym sposobem, w jaki właśnie to rozwiązałem, jest tymczasowe ustawienie tego projektu (najprawdopodobniej biblioteki klas) na projekt startowy. Zmusza to konsolę menedżera pakietów do używania tego projektu jako źródła konfiguracji. Jednym z powodów, dla których jest skonfigurowany w ten sposób, jest model odgórny, którym zwykle podążają pliki econfig. Ogólna zasada jest taka, że projekt najbliższy klientowi (na przykład aplikacja MVC) to web.config lub app.config, który będzie używany.
źródło
Upewnij się, że umieściłeś ciąg połączenia w pliku ROOT web.config projektu startowego.
Wiem, że w pewnym sensie stwierdzam coś oczywistego, ale zdarzyło mi się to również - chociaż już Miałem już ciąg połączenia w Web.Config mojego projektu MVC (plik .edmx został umieszczony w innym projekcie biblioteki klas) i nie mogłem nie dowiem się, dlaczego wciąż otrzymuję wyjątek ... Krótko mówiąc, skopiowałem ciąg połączenia do Views \ Web.Config przez pomyłkę, w dziwnej kombinacji zmęczenia i nie przewijania do dołu scenariusz eksploratora rozwiązań. Tak, te rzeczy przytrafiają się także doświadczonym programistom :)
źródło
Ten problem występuje, gdy używasz warstw w projekcie i definiujesz lub instalujesz pracę ramki Entity w DataLayer i próbujesz uruchomić projekt
Aby rozwiązać ten problem, skopiuj parametry połączenia z warstwy, na której znajduje się plik Edmx i wklej parametry połączenia w głównym pliku web.config.
źródło
Dodaj ciąg połączenia do głównego pliku web.config projektu MVC „kontener”, który odwołuje się do biblioteki klas w następujący sposób:
Jeśli nie chcesz używać „MyEntities” jako nazwy połączenia, zmień go według własnego uznania, ale dokonaj następującej zmiany w swojej klasie MyEntities DbContext:
Przyczyną tego błędu jest to, że jeśli nie podamy nazwy ciągu połączenia lub nie podłączymy ciągu w pochodnej klasie DbConext (w Twoim przypadku jest to MyEntities), wówczas DbContext automatycznie wyszuka ciąg połączenia w głównym pliku web.config, którego nazwa to taki sam jak nazwa klasy pochodnej (w twoim przypadku jest to My Entities).
źródło
Miałem ten problem podczas uruchamiania MSTest. Nie mogłem go uruchomić bez flagi „noisolation”.
Mam nadzieję, że to komuś pomaga. Kosztowało mnie to dużo czasu, żeby to rozgryźć. Wszystko działało dobrze z IDE. Coś dziwnego w Entity Framework w tym kontekście.
źródło
Regularne migracje
Istnieją dwie opcje - pierwszą, którą wszyscy tutaj zasugerowali, jest sprawdzenie, czy parametry połączenia znajdują się w pliku Web.config projektu. Podczas pracy z ciągami połączeń z ustawień aplikacji platformy Azure oznacza to zastąpienie wartości Web.config wartościami Azure.
Azure lub automatyczne migracje (programowe)
Jeśli programujesz migracje programowo, dostępna jest druga opcja, która umożliwia uruchamianie migracji przy użyciu ciągu połączenia, który jest uzyskiwany dynamicznie (lub za pomocą ustawień aplikacji Azure) bez przechowywania go w pliku Web.config:
Podczas ustawiania konfiguracji za TargetDatabase użyj DbConnectionInfo konstruktor, który pobiera ciąg połączenia i nazwę operatora zamiast konstruktora, który trwa zaledwie nazwę połączenia. Jeśli ciąg połączenia nie ma nazwy dostawcy i używasz SQL Server / Azure SQL, użyj „System.Data.SqlClient”
źródło
Może to również spowodować, że w kodzie wywołującym będzie odwoływana niewystarczająca liczba odwołań dll. Mały niezdarny hack może uratować Twój dzień.
Postępowałem zgodnie z podejściem DB First i stworzyłem plik EDMX w projekcie biblioteki klasy DAL, a to miało odniesienie do biblioteki klasy BAL, do której z kolei odwoływała się usługa WCF.
Ponieważ otrzymywałem ten błąd w BAL, próbowałem wyżej wspomnianej metody, aby skopiować szczegóły konfiguracji z App.config projektu DAL, ale nie rozwiązałem. Ostatecznie, dzięki wskazówkom znajomego, właśnie dodałem atrapę pliku EDMX do projektu WCF (z odpowiednią łącznością DB itp.), Więc zaimportowałem wszystko, co konieczne, a następnie usunąłem plik EDMX i po prostu pozbyłem się czysta wersja.
źródło
Na górze odpowiedzi @RyanMann znajduje się komentarz, który sugeruje:
To fantastyczna sugestia!
Działa również w celu udostępniania parametrów połączenia między plikami App.config i Web.config!
Każdy, kto chce zastosować się do tej sugestii, powinien przejść do tej SO odpowiedzi . Ma naprawdę świetny przewodnik krok po kroku na temat udostępniania ciągów połączeń między wieloma projektami w rozwiązaniu.
Jedynym zastrzeżeniem jest to, że
configSource
musi istnieć w tym samym katalogu lub podkatalogu. Powyższy link wyjaśnia, jak użyć „Dodaj jako link”, aby obejść ten problem.źródło
Wystąpił ten błąd podczas próby użycia EF w wtyczce AutoCAD. Wtyczki CAD pobierają parametry połączenia z pliku acad.exe.config. Dodaj ciąg połączenia, jak wspomniano powyżej, do pliku konfiguracyjnego programu acad i działa.
Kredyt trafia do Norman.Yuan z ADN.Network.
źródło
Jeśli używasz modelu MVVM, spróbuj skopiować parametry połączenia do wszystkich części projektu.
Na przykład, jeśli twoje rozwiązanie zawiera dwa projekty, projekt biblioteki klas i projekt wpf, musisz skopiować parametry połączenia projektu zaplecza (biblioteka klasy porject) i umieścić kopię w pliku App.config projektu wpf.
Mam nadzieję, że to ci pomoże :)
źródło
Dodaj Connectoinstrnig w pliku web.config
źródło