In der Anwendungskonfigurationsdatei wurde keine Verbindungszeichenfolge mit dem Namen "MyEntities" gefunden


246

Ich verwende Entity Framework und ASP.NET MVC 4, um eine Anwendung zu erstellen

Meine Lösung ist in zwei Projekte unterteilt.

  • Eine Klassenbibliothek, die meine Datenmodelldatei (.edmx) und einige benutzerdefinierte Schnittstellen enthält
  • Das 'Container'-MVC-Projekt, das auf die obige Klassenbibliothek verweist

Mein Problem ist, dass beim Versuch, den DbContext ' MyEntites ' zu verwenden , der folgende Fehler angezeigt wird:

In der Anwendungskonfigurationsdatei wurde keine Verbindungszeichenfolge mit dem Namen "MyEntities" gefunden.

Ich denke, das Problem hat etwas damit zu tun, dass die Verbindungszeichenfolge in der app.config der Klassenbibliothek und nicht im MVC-Projekt liegt.

Hat jemand irgendwelche Vorschläge?


15
Nicht genau der gleiche Kontext wie Ihr (automatische Migrationen mit EF6), aber ich hatte das gleiche Problem mit einer ähnlichen Fehlermeldung, als ich einen untergeordneten Zweig in TFS erstellte und damit begann, daran zu arbeiten. Das Markieren des MVC-Projekts als Startprojekt hat dieses Problem behoben. Ausgabe 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).
Mechanisches Objekt

Antworten:


309

Versuchen Sie, die Verbindungszeichenfolge in die .config-Datei im MVC-Projekt zu kopieren.


63
Funktioniert perfekt, würde aber gerne wissen, warum das referenzierte Projekt keine eigene Konfigurationsdatei zum Abrufen der Verbindungszeichenfolge verwendet.
Null Head

7
@ Alexander Alte Frage aber ja, ich würde auch gerne wissen warum.
Kehlan Krumme

22
@Alexander, das Framework lädt und verwendet die Konfigurationsdatei (en) für die ausführende Assembly. In diesem Fall ist es das Webprojekt. Klassenbibliotheken haben im Allgemeinen keine eigenen Konfigurationsdateien.
Kiprainey

24
Wenn die Befehle zum Aktivieren der Migration im Kontext der NuGet COnsole ausgeführt werden, wird die Konfigurationsdatei für Startprojekte angezeigt, nicht unbedingt das Projekt, in dem Sie sich befinden würden. Legen Sie das Projekt einfach mit der app.config fest, die Sie als Start verwenden möchten Projekt. Optional können Sie Ihre Verbindungszeichenfolgen in einer Konfigurationsdatei speichern und dann in anderen Projekten auf <connectionString configSource = "../ ProjectDir / SharedConnections.config" /> verweisen
Ryan Mann

3
Ich habe genau diese Fehlermeldung erhalten, aber meine .config-Datei - im richtigen Projekt - hat tatsächlich die richtige Verbindungszeichenfolge aufgelistet. Ich habe jedoch Transformationen verwendet, und auf die Verbindungszeichenfolge wurde in der transformierten .config-Datei natürlich nicht verwiesen. Darauf sollten Sie also achten, wenn Sie Konfigurationsdatei-Transformationen verwenden.
Morten Nørgaard

143

Sie haben Recht, dies geschieht, weil die Klassenbibliothek (in der sich die .edmx-Datei befindet) nicht Ihr Start- / Hauptprojekt ist.

Sie müssen die Verbindungszeichenfolge in die Hauptprojektkonfigurationsdatei kopieren.

Wenn Ihr Start- / Hauptprojekt keine Konfigurationsdatei hat (wie in meinem Konsolenanwendungsfall), fügen Sie einfach eine hinzu (Startprojekt - Neues Element hinzufügen -> Anwendungskonfigurationsdatei).

Weitere relevante Informationen finden Sie hier: MetadataException: Die angegebene Metadatenressource kann nicht geladen werden


8
Die wichtigste Antwort darauf ist, dass die Klassenbibliothek (in der sich die EDMX-Datei befindet) nicht Ihr STARTUP-Projekt ist. Ich stellte fest, dass mein Startprojekt nicht auf das Projekt eingestellt war, in dem sich meine web.config befand. Es war eine Konsolen-App mit einer anderen app.config. Wenn Sie also Ihrer Weblösung Konsolenanwendungen hinzufügen, stellen Sie sicher, dass Ihr Webprojekt das Startprojekt ist, wenn Sie die Update-Datenbank ausführen!
Karl

1
Ich habe mein Hauptprojekt aus irgendeinem Grund entladen und nach dem erneuten Laden wurde der Fehler beim Hinzufügen von Migrationen angezeigt. Durch erneutes Erstellen des Startprojekts des Hauptprojekts wurde das Problem behoben. Danke @Oren
Azadrum

2
Mein Startprojekt wurde versehentlich geändert. Das ist der Schlüssel. Ihre Antwort hat wirklich geholfen!
Fabio Milheiro

98

Stellen Sie sicher, dass Sie Ihr Projekt (mit dem DbContext) als Start erstellen

Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie

ODER

Fügen Sie dem Projekt, das als Start festgelegt ist, Ihre Verbindungszeichenfolge in der app.config (oder web.config) hinzu.

ODER

Rufen Sie den Befehl so auf

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'

Dann versuchen Sie es erneut


2
Es ist eigentlich das Projekt enthält die Verbindungszeichenfolge sollte als Startprojekt festgelegt werden, und normalerweise ist es nicht das Projekt, in dem sich Ihre DbContext-Datei befindet
Raymond Wang

1
... also muss nicht nur sichergestellt werden, dass das Paket Mgr auf die richtige Ebene abzielt, sondern auch dieselbe Ebene Set as Startup Project- wie im obigen Screenshot gezeigt. (Auch wenn Sie F5
drücken

3
Das hat mir das Leben gerettet. Obwohl ich im Paketmanager das Standardprojekt auf das Projekt eingestellt hatte, in dem der Kontext festgelegt wurde, wurde es immer noch nicht überschrieben.
Garfbradaz

1
"Aber es hat gestern funktioniert! Genau das gleiche Kommando !" => DAS!
Simon_Weaver

1
Der einfachste Weg =)
Alexandr

29

Sie könnten einfach die Verbindungszeichenfolge an übergeben EntityFrameworkund mit Ihrem Leben weitermachen:

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

und machte meinen Tag auch, weil ich keine Lösung finden konnte, warum mein Startprojekt plötzlich aufhörte, die Konfigurationsdatei zu finden. Meine app.config und <appname> .exe.config wurden in meinem Startprojekt-Bin angezeigt, und dennoch konnte EntityFramework die Verbindungszeichenfolge, die ich für immer verwendet hatte, nicht finden. Ich habe kürzlich eine Reihe nicht verwendeter Projekte aus der Lösung entfernt und frage mich, ob das etwas damit zu tun hat. Ich habe ein Webprojekt aus der Lösung entfernt. Ich frage mich, ob meine anderen Projekte auf der web.config oder so etwas Ungewöhnlichem basieren.
GrayDwarf

Die Konfiguration des laufenden Projekts wird von allen anderen untergeordneten Projekten verwendet.
Serj Sagan

1
aber wie man den Anbieternamen einstellt?
FizxMike

9

Wie Sie vermuten, hat dies damit zu tun, dass sich die Verbindungszeichenfolge in app.config der Klassenbibliothek befindet.

Kopieren Sie den Eintrag aus der Klasse app.config in den Container app.configoder die web.configDatei


8

Wenn Sie mehrere Projekte in Lösung haben, setzen Sie das Projekt als gestartet, wo Sie Ihre Wahrheit App.config haben.


7

Kopieren Sie die Verbindungszeichenfolge in eine Datei app.configoder eine web.configDatei in dem Projekt, das auf "Als StartUpProjekt festlegen" festgelegt wurde. Wenn Sie ein Entity-Framework in einem Datenschichtprojekt verwenden, installieren Sie bitte das Entity-Framework-Nuget im Hauptprojekt.


4

Es kommt auch vor, wenn das Startprojekt wird geändert , um die eine, die nicht der Fall ist , die haben Verbindungszeichenfolgen .

  1. Rechtsklick Lösung - Klicken Sie auf Eigenschaften
  2. Wählen Sie unter Allgemeine Eigenschaften Startprojekt aus
  3. Wählen Sie im rechten Bereich das Projekt mit den Verbindungszeichenfolgen aus (in den meisten Fällen handelt es sich um MVC-Projekte - das Projekt, mit dem die Lösung gestartet wird).

Ja es funktioniert. Ich habe eine Klassenbibliothek für EF erstellt, um mit der DB zu kommunizieren, und hatte das gleiche Problem.
Satinder Sidhu

4
  1. Fügen Sie eine App.Config-Datei hinzu
  2. Legen Sie das Projekt als Startprojekt fest.
  3. Stellen Sie sicher, dass Sie die Verbindungszeichenfolgen nach dem entityFrameworkAbschnitt hinzufügen :

    <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

Ja, es ist albern. Sie können das Kopieren der Verbindungszeichenfolge mithilfe eines Verbindungsgenerators vermeiden. VB.Net-Code (in der Produktion verwendet, hier jedoch geringfügig geändert, daher als ungetestet behandeln und gerne bei Problemen behilflich sein): Wenn ich eine serverName-Variable oder eine databaseName-Variable habe, übergebe ich sie an eine Methode und lasse sie die Verbindung generieren für mich:

    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

Verwenden Sie mehr als ein Projekt für Ihre Lösung?

Wenn dies der Fall ist, müssen Sie die Webkonfiguration überprüfen, die sich im selben Projekt wie die .edmx-Datei befindet


Ja, das ist der Fall. Das Projekt, das die Verbindungszeichenfolge enthält, ist eine Klassenbibliothek, die nur eine App.config-Datei enthält. Das MVC-Projekt scheint dies nicht zu überprüfen.
JJC99

Während der Entwicklung wird nur die app.config auf seinem Projekt überprüft, Sie müssen dort hinzufügen
Diego

Danke für deine Antwort. Ich habe versucht, die Verbindungszeichenfolge aus dem Projekt zu kopieren, das die edmx-Datei enthält, und sie in der Stammdatei web.config in meinem MVC-Projekt abzulegen. Leider kann die Verbindungszeichenfolge immer noch nicht gefunden werden. Muss ich die Verbindungszeichenfolge in irgendeiner Weise ändern?
JJC99

es ist anders herum. In der Entwicklungszeit benötigen Sie die Zeichenfolge in der app.cofnig des Projekts, das die .edmx-Datei enthält. Wenn Sie es haben, ist der Name vielleicht falsch. Der Name der Verbindungszeichenfolge sollte mit der Eigenschaft "Entity Containr Name" Ihrer .edmx-Datei übereinstimmen
Diego

1

Fügen Sie ConnectionString zur MVC Project Web.config-Datei hinzu


1

Ich hatte dieses Problem, wenn ich mehrere Projekte verwende, das Startprojekt mit web.config und app.config für das EntityFramework-Projekt.

Um dieses Problem zu vermeiden, müssen Sie:

  1. Sie benötigen die Verbindungszeichenfolge in der gestarteten * .config-Datei.
  2. Sie müssen die EntityFramework-DLL in Ihren Referenzen installiert haben

1

Ich habe das gleiche Problem konfrontiert. Ich habe die Verbindungszeichenfolge nicht in das Startprojekt eingefügt, da ich einen Datenzugriffsvorgang von einer anderen Ebene aus durchführe. Wenn Sie in Ihrem Startprojekt keine app.config haben, fügen Sie die Datei app.config hinzu und fügen Sie dieser Konfigurationsdatei eine Verbindungszeichenfolge hinzu.


1
Vielen Dank, ich hatte ein Problem mit dem Laden meines Projekts und es hat das "Startup Project" verloren. Ihre Antwort erinnerte mich daran, sicherzustellen, dass das Projekt mit der Kontextdatei und app.config das Startup war.
Mastro

1

Ich habe dies dadurch erreicht, dass das Projekt nicht als Start festgelegt wurde, wie aus einer anderen Antwort hervorgeht. Mein Beitrag dazu - Wenn Sie Add-Migrations und Update-Database ausführen, geben Sie das Startprojekt als Teil des Befehls in der Nuget Package Manager-Konsole an (enthalten Sie nicht die Zeichen '[' oder ']', um Ihnen nur zu zeigen, dass Sie es sind müssen den dort befindlichen Text in Ihren Projektnamen ändern):

  1. Migrationen aktivieren
  2. Add-Migrations -StartupProject [Ihr Projektname, der die Datenkontextklasse enthält]
  3. Update-Database -StartupProject [gleicher Projektname wie oben]

Das sollte es tun.


Auf diese Weise können Sie die Befehle in Ihre Prozeduren aufnehmen und müssen das Startprojekt nicht ständig von der Standardeinstellung entfernen.
JakeJ

1

Dies liegt daran, dass Ihre Kontextklasse von DbContext geerbt wird. Ich denke dein ctor ist so:

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

name=... sollte in den Namen Ihres connectionString geändert werden


0

Die Verbindungszeichenfolge, die von dem Projekt generiert wird, das die .edmx-Datei enthält, generiert die Verbindungszeichenfolge. Dies scheint ein Überbleibsel aus den Dateien der Datei app.config zu sein, die in das Ausgabeverzeichnis kopiert und von der ausführbaren Datei zum Speichern von Laufzeitkonfigurationsinformationen referenziert wurden.

Dies unterbricht das Webprojekt, da es keinen automatischen Prozess zum Hinzufügen zufälliger .config-Informationen zur web.config-Datei für das Webprojekt gibt.

Am einfachsten ist es, die Verbindungszeichenfolge aus der Konfigurationsdatei in den Verbindungsabschnitt der Datei web.config zu kopieren und den Inhalt der Konfigurationsdatei zu ignorieren.


0

Der beste Weg, dies zu beheben, besteht darin, das Projekt (höchstwahrscheinlich eine Klassenbibliothek) vorübergehend auf das Startprojekt zu setzen. Dadurch wird die Paketmanagerkonsole gezwungen, dieses Projekt als Konfigurationsquelle zu verwenden. Ein Grund für die Einrichtung auf diese Weise ist das Top-Down-Modell, dem die Econfig-Dateien normalerweise folgen. Als Faustregel gilt, dass das Projekt, das dem Client am nächsten liegt (z. B. MVC-Anwendung), die web.config oder app.config ist, die verwendet werden.


0

Stellen Sie sicher, dass Sie die Verbindungszeichenfolge in der ROOT web.config des Startprojekts platziert haben.

Ich weiß, dass ich hier das Offensichtliche sage, aber es ist mir auch passiert - obwohl ich die Verbindungszeichenfolge bereits in der Web.Config meines MVC-Projekts hatte (die .edmx-Datei wurde in einem anderen Klassenbibliotheksprojekt abgelegt) und ich konnte es nicht Ich finde nicht heraus, warum ich immer wieder eine Ausnahme bekomme ... Kurz gesagt, ich habe die Verbindungszeichenfolge versehentlich in die Ansicht \ Web.Config kopiert, in einer seltsamen Kombination aus Müdigkeit und nicht nach unten scrollen -das-Lösungs-Explorer-Szenario. Ja, diese Dinge passieren auch erfahrenen Entwicklern :)


0

Dieses Problem tritt auf, wenn Sie Ebenen in Ihrem Projekt verwenden und Entity Frame Work in DataLayer definieren oder installieren und versuchen, Ihr Projekt auszuführen

Um dieses Problem zu beheben, kopieren Sie die Verbindungszeichenfolge von der Ebene, auf der sich die Edmx-Datei befindet, und fügen Sie die Verbindungszeichenfolge in die Datei web.config ein.


0

Fügen Sie der Stammdatei web.config des MVC-Projekts 'container' eine Verbindungszeichenfolge hinzu, die wie folgt auf die Klassenbibliothek verweist:

 <connectionStrings>

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

  </connectionStrings>

Wenn Sie "MyEntities" nicht als Verbindungsnamen verwenden möchten, ändern Sie ihn wie gewünscht, nehmen Sie jedoch die folgende Änderung in Ihrer MyEntities DbContext-Klasse vor:

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

Der Grund für diesen Fehler ist: Wenn wir den Namen der Verbindungszeichenfolge oder der Verbindungszeichenfolge in der abgeleiteten Klasse von DbConext nicht angeben (in Ihrem Fall MyEntities), sucht DbContext automatisch nach einer Verbindungszeichenfolge in der Stammdatei web.config, deren Name lautet Entspricht dem abgeleiteten Klassennamen (in Ihrem Fall "Meine Entitäten").


0

Ich hatte dieses Problem beim Ausführen von MSTest. Ohne die Flagge "Noisolation" könnte ich es nicht zum Laufen bringen.

Hoffentlich hilft das jemandem. Hat mich viel Zeit gekostet, um das herauszufinden. Von der IDE lief alles gut. Etwas Seltsames am Entity Framework in diesem Zusammenhang.


0

Regelmäßige Migrationen

Es gibt zwei Möglichkeiten: Die erste, die hier vorgeschlagen wird, besteht darin, sicherzustellen, dass sich die Verbindungszeichenfolge in der Datei Web.config des Projekts befindet. Wenn Sie mit Verbindungszeichenfolgen aus den Azure-Anwendungseinstellungen arbeiten, bedeutet dies, dass Sie Ihre Web.config-Werte mit den Azure-Werten überschreiben.

Azure oder automatische Migrationen (programmatisch)

Wenn Sie Migrationen programmgesteuert ausführen, steht eine zweite Option zur Verfügung, mit der Sie Migrationen mithilfe einer Verbindungszeichenfolge ausführen können, die dynamisch (oder über Azure-Anwendungseinstellungen) abgerufen wird, ohne sie in Web.config zu speichern:

Verwenden Sie beim Festlegen der TargetDatabase der Konfiguration den Konstruktor DbConnectionInfo , der eine Verbindungszeichenfolge und einen Anbieternamen verwendet, anstelle des Konstruktors, der nur einen Verbindungsnamen verwendet. Wenn Ihre Verbindungszeichenfolge keinen Anbieternamen hat und Sie SQL Server / Azure SQL verwenden, verwenden Sie "System.Data.SqlClient".


0

Dies kann auch dazu führen, dass im aufrufenden Code nicht genügend DLL-Referenzen referenziert werden. Ein kleiner ungeschickter Hack könnte Ihren Tag retten.

Ich verfolgte den DB First-Ansatz und hatte die EDMX-Datei im DAL-Klassenbibliotheksprojekt erstellt. Diese bezog sich auf die BAL-Klassenbibliothek, auf die wiederum von einem WCF-Dienst verwiesen wurde.

Da ich diesen Fehler in der BAL bekam, hatte ich die oben erwähnte Methode versucht, um die Konfigurationsdetails aus der App.config des DAL-Projekts zu kopieren, aber nicht gelöst. Letztendlich habe ich mit dem Tipp eines Freundes dem WCF-Projekt eine Dummy-EDMX-Datei hinzugefügt (mit relevanter DB-Konnektivität usw.), also alles Notwendige importiert und dann einfach die EDMX-Datei gelöscht und das Problem mit beseitigt ein sauberer Build.


0

Es gibt einen Kommentar zur Top-Antwort von @RyanMann, der Folgendes vorschlägt:

Speichern Sie Ihre Verbindungszeichenfolgen in einer Konfigurationsdatei und verweisen Sie sie dann in anderen Projekten auf <connectionString configSource="../ProjectDir/SharedConnections.config" />

Dies ist ein fantastischer Vorschlag!

Es funktioniert auch, um Verbindungszeichenfolgen zwischen App.config- und Web.config-Dateien freizugeben!

Wer diesem Vorschlag folgen möchte, sollte sich diese SO-Antwort ansehen . Es enthält eine wirklich großartige Schritt-für-Schritt-Anleitung zum Teilen von Verbindungszeichenfolgen zwischen mehreren Projekten in einer Lösung.

Die einzige Einschränkung besteht darin, dass configSourcesie im selben Verzeichnis oder in einem Unterverzeichnis vorhanden sein muss. Der obige Link erklärt, wie Sie "Als Link hinzufügen" verwenden, um dies zu umgehen.


0

Ich hatte diesen Fehler beim Versuch, EF in einem AutoCAD-Plugin zu verwenden. CAD-Plugins erhalten die Verbindungszeichenfolge aus der Datei acad.exe.config. Fügen Sie die Verbindungszeichenfolge wie oben erwähnt zur acad-Konfigurationsdatei hinzu, und es funktioniert.

Der Kredit geht an Norman.Yuan von ADN.Network.


0

Wenn Sie ein MVVM-Modell verwenden, versuchen Sie, die Verbindungszeichenfolgen in alle Teile Ihres Projekts zu kopieren.

Wenn Ihre Lösung beispielsweise zwei Projekte enthält, das Klassenbibliotheksprojekt und das wpf-Projekt, müssen Sie die Verbindungszeichenfolgen des Backend-Projekts (Bibliotheksklasse porject) kopieren und eine Kopie in die App.config-Datei des wpf-Projekts einfügen.

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

Hoffe es ist hilfreich für dich :)


-2

Fügen Sie Connectoinstrnig in die Datei web.config ein

<ConnectionStiring> <add name="dbName" Connectionstring=" include provider name too"  ></ConnectionStiring>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.