Die angegebene benannte Verbindung wurde entweder nicht in der Konfiguration gefunden, ist nicht für die Verwendung mit dem EntityClient-Anbieter vorgesehen oder nicht gültig

170

Ich habe ein Framework-Objekt mit einer Entität, und wenn ich es meinem Projekt connectionstring hinzufüge, wird das app.configim connectionstringAbschnitt hinzugefügt. Wenn ich jedoch ein neues erstellen entitycontextund dieses verwenden möchte connectionstring, wird dieser Fehler angezeigt

user421413
quelle
4
Danke für den Link, Craig. Ich stimme jedoch dafür, diesen Thread beizubehalten, da der Titel mir geholfen hat, den MetadataException-Fehler zu finden.
JP2-Code
Dies ist mir passiert, als die Konfigurationsdatei aus irgendeinem seltsamen Grund nicht mit einer Verbindungszeichenfolge aktualisiert wurde.
P.Brian.Mackey

Antworten:

217

Ich vermute, dass Ihr Problem auf die Tatsache zurückzuführen ist, dass Ihre Lösung mehr als ein Projekt enthält und das Projekt, das Ihre Entity-Framework-Inhalte einschließlich edmxDateien enthält, NICHT das Startprojekt der Lösung ist. In diesem Fall app.configkann CLR die Verbindungszeichenfolge zur Laufzeit nicht finden, auch wenn sie im EF- Projekt vorhanden ist. Wenn Ihre Lösung beispielsweise eine Website und ein EF-Projekt enthält, müssen Sie die Verbindungszeichenfolge aus den EF-Projekten app.configauf Ihre Website kopieren web.config. Grundsätzlich sollten alle Verbindungszeichenfolgendaten in der Konfigurationsdatei des Projekts vorhanden sein, von der die .Net-Threads von CLR (dh Ihrem Startprojekt) initiiert wurden. Wenn dies nicht der Fall ist, öffnen Sie einfach IhreedmxDatei, klicken Sie mit der rechten Maustaste auf die Oberfläche, wählen Sie Eigenschaften aus, kopieren Sie die Verbindungszeichenfolge und fügen Sie sie in den app.configAbschnitt Verbindungszeichenfolge ein. Auf diese Weise können Sie sicherstellen, dass Sie die richtige in Ihrer Konfiguration haben.

BEARBEITEN:
Wie Sie hier unter Dokumentation im ObjectContext-Konstruktor sehen können , ist der erste Parameter der Name der Verbindungszeichenfolge, der zum Zeitpunkt der Erstellung Ihres EDM-Codes generiert wird. Wenn sich der Name Ihres Verbindungsstring-Namens irgendwie ändert, müssen Sie nur mit der rechten Maustaste auf Ihr Modell klicken und "Modell aus Datenbank aktualisieren ..." auswählen. Folgen Sie dann dem Assistenten, um Ihr Confing und Ihren Designer zu aktualisieren, um dies widerzuspiegeln Veränderung.

Morteza Manavi
quelle
1
Hallo Morteza und danke für deine Antwort, aber ich kopiere vorher den Verbindungsstring-Abschnitt in web.config, aber der Fehler ist nicht behoben, aber wenn in entitymodel.designer ersetze (public EntityContext (): base ("name = EntityContext", EntityContext " )) mit dem Verbindungsstring funktionierte dies, alle idae
user421413
1
@Morteza, haben Sie eine Lösung für Projekte, in denen die ausführende Assembly keine app.config hat? In meinem Fall ist die aufrufende ausführbare Datei eine VB6-App, die meine Assembly (wo sich die Entitätsobjekte befinden) über COM Interop aufruft.
Verderblicher Dave
4
so einfach und doch so frustrierend. Up VOTE. Es lebe der Stackoverflow!
GranadaCoder
3
Wenn Sie WCF verwenden, denken Sie daran, die Verbindungszeichenfolge in Ihr Serviceprojekt aufzunehmen
Nathan
1
Danke Morteza, hat mir viel Zeit gespart!
Chris
32

Sie müssen die Verbindungszeichenfolge in der app.config in Ihre web.config kopieren oder die gesamte Datei in das Projekt kopieren, in dem die Ausgabe angezeigt wird. Es ist eine der Bedingungen, um das Framework zu konsumieren.

Musikero31
quelle
1
Fügen Sie einfach dieselbe Verbindungszeichenfolge (wie im Datenzugriffsprojekt) in Ihre web.config ein (im Front-End-Projekt).
Dänisch
@ Musikero31 Ich benutze EF und definiere alle Entity-Verbindungszeichenfolgen im Code. Ich habe nichts in einer Konfiguration, die sich darauf bezieht.
Keith Beard
Nachdem ich DAL-Dateien in ein neues Projekt kopiert hatte, erhielt ich auch den obigen Fehler. Bei näherer Betrachtung der Konfigurationsdateien stellte ich fest, dass die Verbindungszeichenfolge durch EF ersetzt wurde. Ich konnte die richtige Verbindungszeichenfolge manuell in das neue Projekt kopieren / einfügen und es funktionierte.
Ravi Ram
9

Ich bin auf dieses Problem gestoßen, als ich versucht habe, meine benutzerdefinierte Datenbanklogik in eine DLL zu stellen, die von mehreren Projekten in meiner Lösung verwendet werden soll.

Obwohl die DLL die richtige Datei app.config hatte, funktionierte sie nicht. Entity Frameworks wollten die Verbindungsinformationen in der app.config der .exe. Das Kopieren der Informationen dorthin funktionierte einwandfrei.

Mortezas Lösung, die Verbindungszeichenfolge direkt in die .edmx einzufügen, funktionierte bei mir nicht, da ich den Wert dort nicht einfügen konnte - obwohl ich genau das tun wollte.

Walt Stoneburner
quelle
3
Obwohl es im Verzeichnis meiner Exe nur eine app.config gab (und das war die einzige Konfigurationsdatei in diesem Verzeichnis), wurde sie nicht gelesen. Ich musste die Datei myExe.exe.config
Mario
6

Hallo, ich hatte dieses Problem und es machte mich verrückt. Wie auch immer, endlich habe ich herausgefunden, was das Problem war. Als erstes müssen Sie sicherstellen, dass das connectionstringsIn app.configund web.configdas Gleiche sind. Dann müssen Sie auf die .edmxDatei doppelklicken, damit Sie die Tabellen sehen können. Sobald Sie irgendwo in der Nähe der Tabellen, aber nicht auf den Tabellen klicken, gehen Sie zu den Eigenschaften. Wählen Sie aus der Dropdown-Liste den ConceptualEntityModelNamen des Entitätscontainers aus, suchen Sie ihn und merken Sie sich ihn gut.

Gehen Sie als Nächstes zum Designer der edmx-Datei und öffnen Sie die Konstruktoren. (Der Designer ist der Unterordner der edmx-Datei.) Die Konstruktoren sollten zwei Parameter im BASE-Parameter haben

public DBEntities() : base("name=DBEntities", "DBEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

das ist einer von ihnen. Der erste Parameter sollte den Namen der Projektdatei enthalten, in der sich die .edmxDatei befindet. Der zweite Parameter muss den Namen des Entitätscontainernamens aus den zuvor erwähnten Eigenschaften enthalten. Vergessen Sie nicht, alle Konstruktoren mit folgenden Elementen zu arrangieren:base("", "")

Zumindest war das mein Problem und mein Problem wurde so gelöst. Ich hoffe du schaffst es, deine so zu lösen.

MaltaCoders
quelle
6

Ich hatte eine Variation davon, die niemand zu behandeln schien.

Ich hatte ein Hauptprojekt mit einigen Modellen und ein Testprojekt mit Komponententests. Das Testprojekt funktionierte, wurde dann jedoch mit dem im OP genannten Fehler gestoppt. Ich hatte die EDMX-Datei nicht umbenannt oder verschoben.

In vielen Ratschlägen wurde der Vergleich von .config-Dateien erwähnt, aber mein Projekt hatte überhaupt keine.

Am Ende habe ich die Datei app.config aus dem Hauptprojekt in mein Testprojekt kopiert und dann hat es funktioniert. Ob dies der richtige Schritt ist oder Wartungsprobleme auftreten, wenn zusätzliche Modelle hinzugefügt werden, weiß ich nicht, aber zumindest werden meine Komponententests jetzt wieder korrekt ausgeführt.

S. Baggy
quelle
Da ich dies gepostet habe, wurde mir klar, dass es wahrscheinlich am besten ist, einen Link zur Datei app.config eines anderen Projekts zu erstellen. Der andere Ansatz behebt jedoch das ursprüngliche Problem, wenn überhaupt keine Konfigurationsdatei vorhanden ist.
S. Baggy
4

Obwohl die Antwort von Morteza Manavi dieses Problem löst, besteht eine andere Lösung darin, die Verbindungszeichenfolge dynamisch zu erstellen und an den Konstruktor für Ihren ObjectContext zu übergeben:

public static string CreateConnectionString()
{
    var assemblyPath = Assembly.GetExecutingAssembly().Location;
    string assemblyLocation = Path.GetDirectoryName(assemblyPath);
    string dbPath = Path.Combine(assemblyLocation, "YourDatabase.sdf");
    var sqlBuilder = new SqlConnectionStringBuilder { DataSource = dbPath };

    var entityBuilder = new EntityConnectionStringBuilder
    {
        ProviderConnectionString = sqlBuilder.ConnectionString,
        Provider = "System.Data.SqlServerCe.3.5",
        Metadata = @"res://*/YourModel.csdl|
                 res://*/YourModel.ssdl|
                 res://*/YourModel.msl"
    };

    return entityBuilder.ToString();
}

// Snip...

var entityContext = new YourObjectContext(CreateConnectionString());

Dadurch entfällt die Notwendigkeit, die Verbindungszeichenfolgeninformationen in die app.config Ihres Startprojekts zu kopieren, was zumindest in meinem Fall nicht wünschenswert war.

Nick Spreitzer
quelle
4

Ich habe vergessen, providerName = "System.Data.EntityClient" als Attribut in der Verbindungszeichenfolge hinzuzufügen. Dies führte also zu diesem Fehler

<add name="connectionName" connectionString="metadata=res://*/..." providerName="System.Data.EntityClient" />

anstatt

<add name="connectionName" connectionString="metadata=res://*/..." />
Gertjan
quelle
2

Ich habe gerade festgestellt, dass dieser Fehler auftreten würde, wenn eine App in IIS aus VS2010 zwei Ebenen vom Website-Stamm erstellt wird. Nicht sicher, warum es passiert, müsste mehr untersucht werden. Wenn sich Ihre App beispielsweise in diesem Pfad befindet: /admin/advertiserDer Fehler wird angezeigt, wenn /adminIhre IIS-Site kein virtuelles Verzeichnis enthält.

Ich habe nur ein leeres adminVerzeichnis erstellt, in dem mein .../intepub/wwwrootFehler verschwunden ist.

Sie werden feststellen, dass Sie erst mit dem Debuggen beginnen können, wenn Sie den obigen Schritt ausführen.

Wir hatten dieses Problem in der Vergangenheit in unserem Team. Es dauerte einige Zeit, bis wir uns daran erinnerten, aber genau so haben wir es auch zuvor behoben.

Jovica Zaric
quelle
1

Ich benutze n'tier Architektur und habe das gleiche Problem, aber dieses hilft mir. Ich hoffe, das wird dir helfen. Zuerst haben Sie dasselbe connection stringauf sich, librarieswo Sie wie in auf DB zugreifen können, app.configund web.config danach fügen Sie einfach einen überladenen Konstruktor in die .edmx-Datei (Model.context.cs) ein, der jetzt zwei Konstruktoren hat, einer ist Standard und der andere, den Sie gerade hinzugefügt haben ( überladen).

        public YourEntityName(string connString)
            : base(connString)
        {
        }
Muhammad Asad
quelle
1

Ich hatte eine Klassenbibliothek, die auch nicht mit EF arbeiten wollte. Nachdem ich die app.config (oder nur den Verbindungsstring-Abschnitt) aus meiner Klassenbibliothek in das exe-Projekt kopiert hatte, funktionierte die Verbindung einwandfrei! Wahrscheinlich befindet sich die Konfigurationsdatei im selben Ordner wie das exe-Projekt und wurde daher nicht gefunden. Seien Sie also immer besonders vorsichtig, wenn eine Konfigurationsdatei in einem Klassenbibliotheksprojekt verwendet wird!

Vincent
quelle
0

Nun ... dieses Problem könnte auch einen sehr einfachen (dummen) Grund haben ... Ich habe eine Datei aus einem anderen Projekt kopiert und vergessen, den ConnectionString in der EntityDataSource zu ändern ... wie ich zu Beginn des Projekts war und passiert bin Auf der Anmeldeseite dachte ich, es sei etwas in der Konfiguration, aber es war nur der falsche Name der Verbindungszeichenfolge (und DefaultContainerName).

Gabriel G.
quelle