W pliku konfiguracyjnym aplikacji nie można znaleźć ciągu połączenia o nazwie „MyEntities”


246

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 „ MyEntitespojawia 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?


15
Niezupełnie taki sam kontekst jak twój (automatyczne migracje z EF6), ale miałem ten sam problem z podobnym komunikatem o błędzie, kiedy utworzyłem gałąź potomną na TFS i zacząłem nad nią pracować. Oznaczenie projektu mvc jako projektu rozruchowego rozwiązało ten problem. wyjście 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).
Obiekt mechaniczny

Odpowiedzi:


309

Spróbuj skopiować ciąg połączeń do pliku .config w projekcie MVC.


63
Działa idealnie, ale chciałbym wiedzieć, dlaczego przywoływany projekt nie używa własnego pliku konfiguracyjnego do pobrania ciągu połączenia.
Null Head

7
@Alexander Stare pytanie, ale tak, chciałbym również wiedzieć, dlaczego.
Kehlan Krumme

22
@Alexander, struktura ładuje i używa plików konfiguracyjnych dla wykonującego zestawu. W tym przypadku jest to projekt internetowy. Biblioteki klas na ogół nie mają własnych plików konfiguracyjnych.
kiprainey

24
Polecenia Enable-Migration uruchamiane w kontekście NuGet COnsole, przeglądają plik konfiguracyjny Startup Projects, niekoniecznie projekt, w którym byś się spodziewał. Po prostu ustaw projekt z app.config, który chcesz uruchomić projekt. Opcjonalnie przechowuj parametry połączenia w jednym pliku konfiguracyjnym, a następnie odwołaj się do nich w innych projektach, używając <connectionString configSource = "../ ProjectDir / SharedConnections.config" />
Ryan Mann

3
Dostałem ten dokładny komunikat o błędzie, ale mój plik .config - w odpowiednim projekcie - rzeczywiście podał prawidłowy ciąg połączenia. Korzystałem jednak z transformacji, a ciąg połączenia nie był oczywiście wymieniony w przekształconym pliku .config. Na to więc należy zwrócić uwagę, jeśli używasz transformacji pliku konfiguracyjnego.
Morten Nørgaard,

143

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


8
Kluczową odpowiedzią na to jest to, że biblioteka klas (w której znajduje się plik .edmx) nie jest twoim projektem STARTUP. Uświadomiłem sobie, że mój projekt startowy nie był ustawiony na projekt, w którym był mój web.config. To była aplikacja konsolowa z innym app.config. Więc jeśli dodajesz aplikacje konsolowe do swojego rozwiązania internetowego, upewnij się, że twój projekt internetowy jest projektem startowym po uruchomieniu aktualizacji bazy danych!
Karl

1
Z jakiegoś powodu zwolniłem mój główny projekt i po jego ponownym załadowaniu wystąpił błąd podczas próby dodania migracji. Ponowne uruchomienie projektu głównego rozwiązało problem. Dzięki @Oren
Azadrum

2
Mój projekt startowy został przez pomyłkę zmieniony. To jest klucz do klucza. Twoja odpowiedź naprawdę pomogła!
Fabio Milheiro,

98

upewnij się, że wykonałeś projekt (z DbContext) jako start

na projekcie kliknij prawym przyciskiem myszy i wybierz

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


2
W rzeczywistości projekt zawiera parametry połączenia, które powinny być ustawione jako projekt startowy, i zwykle nie jest to projekt, w którym znajduje się plik DbContext
Raymond Wang

1
... dlatego oprócz upewnienia się, że pakiet Mgr jest ustawiony na właściwą warstwę, ta sama warstwa musi być Set as Startup Project- jak pokazano na zrzucie ekranu powyżej. (nawet jeśli trafisz F5, nie będziesz w stanie uruchomić biblioteki klas)
bkwdesign

3
To uratowało mi życie. Mimo że w Menedżerze pakietów miałem Projekt domyślny ustawiony na projekt, w którym ustawiono kontekst, nadal nie przesłaniał.
garfbradaz

1
„Ale zadziałało wczoraj! Dokładnie to samo polecenie !” => TO!
Simon_Weaver

1
Najłatwiejszy sposób =)
Alexandr

29

Możesz po prostu przekazać ciąg połączenia EntityFrameworki rozpocząć życie:

public partial class UtilityContext : DbContext
{
    static UtilityContext()
    {
        Database.SetInitializer<UtilityContext>(null);
    }

    public UtilityContext()
        : base("Data Source=SERVER;Initial Catalog=DATABASE;Persist Security Info=True;User ID=USERNAME;Password=PASSWORD;MultipleActiveResultSets=True")
    {
    }

    // DbSet, OnModelCreating, etc...
}

i sprawił, że mój dzień również, ponieważ nie mogłem znaleźć rozwiązania, dlaczego mój projekt startowy nagle przestał znajdować plik konfiguracyjny. Moje app.config i <appname> .exe.config pokazywały się w moim binniku projektu startowego, a jednak EntityFramework nie mógł znaleźć ciągu połączenia, którego używałem od zawsze. Ostatnio usunąłem kilka nieużywanych projektów z rozwiązania i zastanawiam się, czy to miało coś z tym wspólnego. Usunąłem projekt internetowy z rozwiązania. Zastanawiam się, czy moje inne projekty polegały na pliku web.config lub czymś niezwykłym.
GrayDwarf

Konfiguracja uruchomionego projektu jest używana przez wszystkie inne projekty potomne.
Serj Sagan

1
ale jak ustawić nazwę dostawcy?
FizxMike,

9

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.configlub web.configpliku


8

Jeśli masz wiele projektów w rozwiązaniu, ustaw projekt jako rozpoczęty w miejscu, w którym masz swoją prawdę App.config.


7

skopiuj parametry połączenia do app.configlub web.configpliku w projekcie, który ustawiono na „Ustaw jako StartUpprojekt”, a jeśli w przypadku użycia struktury encji w projekcie warstwy danych - zainstaluj nuget struktury encji w głównym projekcie.


4

Dzieje się tak również wtedy, gdy projekt startowy zostanie zmieniony na ten, który nie ma parametrów połączenia .

  1. Kliknij prawym przyciskiem myszy Rozwiązanie - kliknij właściwości
  2. W obszarze Wspólne właściwości wybierz projekt startowy
  3. W prawym okienku wybierz projekt, który ma parametry połączenia (w większości przypadków będą to projekty MVC - projekt, który uruchamia rozwiązanie)

Tak to działa. Utworzyłem bibliotekę klas dla EF do komunikacji z DB i miałem ten sam problem.
Satinder Sidhu,

4
  1. Dodaj plik App.Config
  2. Ustaw projekt jako projekt startowy.
  3. Pamiętaj, aby dodać ciągi połączeń po entityFrameworksekcji:

    <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    
    </configSections>
    
    <connectionStrings>
       <!-- your connection string goes here, after configSection -->
    </connectionString>

3

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:

    Dim EfBuilder As New System.Data.EntityClient.EntityConnectionStringBuilder("metadata=res://*/VMware.VmEf.csdl|res://*/VMware.VmEf.ssdl|res://*/VMware.VmEf.msl;provider=System.Data.SqlClient;provider connection string=""data source=none;initial catalog=none;integrated security=True;multipleactiveresultsets=True;App=EntityFramework""")
   Dim SqlBuilder As New Data.SqlClient.SqlConnectionStringBuilder(EfBuilder.ProviderConnectionString)
                        SqlBuilder.DataSource = serverName
                        SqlBuilder.InitialCatalog = databaseName
                        EfBuilder.ProviderConnectionString = SqlBuilder.ConnectionString
                        Using vmCtx As New VmEfConn(EfBuilder.ConnectionString)

2

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


Tak jest w tym przypadku. Projekt zawierający parametry połączenia jest biblioteką klas, która zawiera tylko plik App.config. Wygląda na to, że projekt MVC tego nie sprawdza.
jjc99

w trakcie rozwoju będzie sprawdzał tylko app.config w swoim projekcie, musisz tam dodać
Diego

Dziękuję za odpowiedź. Próbowałem skopiować ciąg połączenia z projektu zawierającego plik edmx i umieścić go w głównym pliku web.config w moim projekcie MVC. Niestety nadal nie może znaleźć ciągu połączenia. Czy muszę w jakikolwiek sposób modyfikować parametry połączenia?
jjc99

jest na odwrót. W czasie projektowania potrzebny jest ciąg con w app.cofnig w projekcie, który ma plik .edmx. Jeśli go masz, być może nazwa jest niepoprawna. Nazwa ciągu połączeń powinna być taka sama, jak właściwość „nazwa kontenera encji” pliku .edmx
Diego


1

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:

  1. Potrzebujesz ciągu połączenia w uruchomionym pliku * .config.
  2. Musisz mieć EntityFramework DLL w swoich referencjach

1

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.


1
Dzięki, miałem problem z ładowaniem mojego projektu i straciłem „Projekt startowy”. Twoja odpowiedź przypomniała mi, że projekt z plikiem kontekstowym i aplikacją app.config to Autostart.
Mastro,

1

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):

  1. Włącz migracje
  2. Add-Migrations -StartupProject [nazwa projektu zawierająca klasę kontekstu danych]
  3. Update-Database -StartupProject [taka sama nazwa projektu jak powyżej]

Że należy to zrobić.


W ten sposób możesz uwzględnić polecenia w swoich procedurach i nie musisz ciągle zmieniać projektu startowego od domyślnego.
JakeJ

1

Jest tak, ponieważ twoja klasa kontekstu jest dziedziczona z DbContext. Myślę, że twój ctor jest taki:

public MyEntities()
    : base("name=MyEntities")

name=... należy zmienić na nazwę połączeniaString


0

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.


0

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.


0

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 :)


0

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.


0

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:

 <connectionStrings>

  <add name="MyEntities" connectionString="complete connection string here" providerName="System.Data.SqlClient" />

  </connectionStrings>

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:

MyEntities: DbContext
 {
   public MyEntities():base("Name-Of-connection-string-you wish to connect"){ }
 }

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).


0

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.


0

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”


0

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.


0

Na górze odpowiedzi @RyanMann znajduje się komentarz, który sugeruje:

Przechowuj parametry połączenia w jednym pliku konfiguracyjnym, a następnie odwołuj się do nich w innych projektach przez <connectionString configSource="../ProjectDir/SharedConnections.config" />

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 configSourcemusi istnieć w tym samym katalogu lub podkatalogu. Powyższy link wyjaśnia, jak użyć „Dodaj jako link”, aby obejść ten problem.


0

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.


0

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.

<connectionStrings>
  <add name="DBEntities" ... />
</connectionStrings>

Mam nadzieję, że to ci pomoże :)


-2

Dodaj Connectoinstrnig w pliku web.config

<ConnectionStiring> <add name="dbName" Connectionstring=" include provider name too"  ></ConnectionStiring>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.