734 Stimmen

MetadataException: Die angegebene Metadaten-Ressource kann nicht geladen werden

Plötzlich bekomme ich immer wieder eine MetadataException bei der Instanziierung meiner generierten ObjectContext Klasse. Die Verbindungszeichenfolge in App.Config sieht korrekt aus - hat sich nicht geändert, seit es das letzte Mal funktionierte - und ich habe versucht, ein neues Modell (edmx-Datei) aus der zugrunde liegenden Datenbank zu regenerieren, ohne dass sich etwas geändert hat.

Hat jemand eine Idee?

Weitere Einzelheiten: Ich habe keine Eigenschaften geändert, ich habe den Namen der Ausgabebaugruppen nicht geändert, ich habe nicht versucht, das EDMX in die Baugruppe einzubetten. Ich habe lediglich 10 Stunden gewartet, vom Verlassen der Arbeit bis ich zurückkam. Und dann hat es nicht mehr funktioniert.

Ich habe versucht, das EDMX neu zu erstellen. Ich habe versucht, das Projekt neu zu erstellen. Ich habe sogar versucht, die Datenbank von Grund auf neu zu erstellen. Kein Glück, was auch immer.

17 Stimmen

Wenn eine Frage SO zu einem bestimmten Produkt mehr als 200k Aufrufe hat, dann funktioniert das Produkt nicht so, wie die Nutzer es erwarten. Ich würde mir wünschen, dass Microsoft sich dieses Problems annimmt. Hier ist ein Link, über den Sie ihnen Vorschläge machen können, wenn Sie Zeit haben: visualstudio.uservoice.com/forums/121579-visual-studio .

1 Stimmen

Mein Problem gelöst, durch Ersetzen der Verbindung-Zeichenfolge aus db-Layer-Projekt kopiert.

0 Stimmen

Ich habe auch dieses Problem, ich nur sauber und neu erstellen Lösung, die gut funktioniert.

886voto

Craig Stuntz Punkte 124703

Dies bedeutet, dass die Anwendung nicht in der Lage ist, das EDMX zu laden. Es gibt mehrere Gründe, die dies verursachen können.

  • Möglicherweise haben Sie die Eigenschaft MetadataArtifactProcessing des Modells in Copy to Output Directory geändert.
  • Die Verbindungszeichenfolge könnte falsch sein. Ich weiß, dass Sie sagen, dass Sie sie nicht geändert haben, aber wenn Sie andere Dinge geändert haben (z. B. den Namen einer Baugruppe), könnte sie trotzdem falsch sein.
  • Möglicherweise verwenden Sie einen Post-Compile-Task zum Einbetten des EDMX in die Baugruppe, der aus irgendeinem Grund nicht mehr funktioniert.

Kurz gesagt, Ihre Frage ist nicht detailliert genug, um eine genaue Antwort zu geben, aber ich hoffe, dass diese Ideen Sie auf den richtigen Weg bringen.

Aktualisierung: Ich habe geschrieben einen Blogbeitrag mit ausführlicheren Schritten zur Fehlerbehebung .

72 Stimmen

Der Verbindungsstring, trotz meiner Bemühungen, ihn mit einem Dienstprogramm zum Vergleichen von Inhalten zu vergleichen, war falsch.

17 Stimmen

Auch für mich war es der Verbindungsstring. Wenn Sie Integrationstests haben, die auch connectionsting in seiner eigenen App.config benötigen, können die Dinge aus der Synchronisation gehen, wenn Sie Ihre edmx aktualisieren.

0 Stimmen

Ja, ich habe die Einstellungen der MetadataArtifactProcessing und der Post-Compile usw. geändert, wie kann ich das Problem beheben?

393voto

MicTech Punkte 38437

Diese kleine Änderung hilft bei diesem Problem.

Ich habe Solution mit 3 Projekten.

connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;

Wechsel zu

connectionString="metadata=res://*/;

14 Stimmen

Bei mir hat es geklappt, aber was bedeutet das eigentlich?

19 Stimmen

@Lance: Ich erkläre dies im Detail in dieser Blogbeitrag

4 Stimmen

@jocull: Nein, in vielen Fällen wird es nicht funktionieren, und in anderen wird es langsam sein. Lesen Sie meinen Blogbeitrag, um zu verstehen, warum.

117voto

user276695 Punkte 1340

Diese Ausnahme kann auftreten, wenn sich Edmx in einem Projekt befindet und Sie es in einem anderen Projekt verwenden.

Der Grund dafür ist Res://*/ ist eine Uri, die auf Ressourcen in der AKTUELLEN Baugruppe verweist. Wenn der Edm in einer anderen Assembly definiert ist als in dem Code, der ihn verwendet, funktioniert res://*/ nicht, da die Ressource nicht gefunden werden kann.

Anstatt "*" anzugeben, müssen Sie stattdessen den vollständigen Namen der Assembly angeben (einschließlich des Tokens für den öffentlichen Schlüssel). Beispiel:

res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...

Eine bessere Möglichkeit, Verbindungszeichenfolgen zu konstruieren, ist der EntityConnectionStringBuilder:

public static string GetSqlCeConnectionString(string fileName)
{
    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlServerCe.3.5";
    csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName);

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

public static string GetSqlConnectionString(string serverName, string databaseName)
{
    SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder();

    providerCs.DataSource = serverName;
    providerCs.InitialCatalog = databaseName;
    providerCs.IntegratedSecurity = true;

    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlClient";
    csBuilder.ProviderConnectionString = providerCs.ToString();

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

Wenn die Ausnahme weiterhin auftritt, öffnen Sie die Assembly in Reflector und überprüfen Sie die Dateinamen Ihrer .csdl-, .ssdl- und .msl-Dateien. Wenn die Ressourcen andere Namen haben als die, die im Metadatenwert angegeben sind, wird es nicht funktionieren.

8 Stimmen

Bitte beachten Sie, dass "YourEdmxFileName" der qualifizierte Name sein muss, z.B. "YourNamespace.YourEdmxFileName", wenn Sie Namespaces in Ihrer Assembly verwenden. Sie müssen jedoch den Teil des Namespace entfernen, der dem Namen Ihrer Assembly entspricht.

5 Stimmen

MSDN sagt, dass der zweite Absatz falsch ist. "Wenn Sie einen Platzhalter (*) verwenden, muss das Entity Framework alle Assemblies nach Ressourcen mit dem richtigen Namen durchsuchen."

0 Stimmen

Ich bin mir ziemlich sicher, dass der Namespace nicht relevant ist, wohl aber der eingebettete Dateipfad. Selbst wenn Sie also die Datei *.Designer.cs der zugehörigen edmx-Datei untersuchen und feststellen, dass der automatisch generierte Klassennamensraum MyCompany... wie auch immer lautet, sollten Sie diesen nicht verwenden. Stattdessen lautet der Pfad Assemblyname, Name des/der Lösungsordners/Dateiname. Zum Beispiel: "metadata=res://*/EntityModels.<filename>.csdl|" + "res://*/EntityModels.<Dateiname>.ssdl|" + "res://*/EntityModels.<Dateiname>.msl;"

72voto

Rick Arthur Punkte 2380

Ich hatte einen ähnlichen Fehler. Ich hatte das Projekt neu erstellt (lange Geschichte), und alles aus dem alten Projekt übernommen. Ich hatte nicht bemerkt, dass sich mein Modell zuvor in einem Verzeichnis namens "Model" befunden hatte und nun in einem Verzeichnis namens "Models" lag. Nachdem ich die Verbindung in meiner Web.Config geändert hatte:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl 

dazu:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl

Alles hat funktioniert (geändert Model à Models ). Beachten Sie, dass ich dies an drei Stellen in dieser Zeichenfolge ändern musste.

2 Stimmen

Ich habe mein Entity Framework-Modell von Model zu DAL verschoben. Aber als ich dann einen Test (eine Woche später) im Testprojekt schrieb, um den Linq Predicatebuilder zu testen. bekam ich diesen Fehler. Ich habe die App.config des Testprojekts so korrigiert, wie sie in der web.config des Hauptprojekts aussah - wie Sie an drei Stellen sagten. Ihre einfache Antwort hat mich also auf die richtige Spur gebracht.

8 Stimmen

Gibt es einen Unterschied zwischen den beiden?!

2 Stimmen

@ErwinRooijakkers Modell vs. ModelS

30voto

leqid Punkte 901

Und eine schnelle Möglichkeit, den Modellnamen ohne Reflector.... zu überprüfen, ist die Suche nach dem Verzeichnis

...obj/{Konfigurationsausgabe}/edmxResourcesToEmbed

und überprüfen Sie, ob die Ressourcendateien .csdl, .msl und .ssdl vorhanden sind. Wenn sie sich in einem Unterverzeichnis befinden, muss der Name des Unterverzeichnisses dem Modellnamen vorangestellt werden.

Meine drei Ressourcendateien befinden sich zum Beispiel in einem Unterverzeichnis Daten also musste mein Verbindungsstring lauten

metadata=res://*/ Daten .MeinModell.csdl|res://*/ Daten .MeinModell.ssdl|res://*/ Daten .meinModell.msl;

(versus metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;).

0 Stimmen

Das war GENAU mein Problem. Ich habe mehrere Stunden damit verloren. Vielen Dank für diese einfache Erklärung

0 Stimmen

Tolle Antwort, die sogar erklärt, wie man den String findet. Und zeigt, dass Unterordner '.' als Trennzeichen haben und nicht '\' oder '/'.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X