MetadataException: Die angegebene Metadatenressource kann nicht geladen werden


681

Plötzlich kann ich MetadataExceptionmeine generierte ObjectContextKlasse immer wieder instanziieren . Die Verbindungszeichenfolge in App.Config sieht korrekt aus - hat sich seit dem letzten Funktionieren nicht geändert - und ich habe versucht, ein neues Modell (edmx-Datei) aus der zugrunde liegenden Datenbank ohne Änderung neu zu generieren.

Hat jemand irgendwelche Ideen?

Weitere Details: Ich habe keine Eigenschaften geändert, den Namen von Ausgabe-Assemblys nicht geändert und nicht versucht, EDMX in die Assembly einzubetten. Ich habe nur 10 Stunden von der Arbeit gewartet, bis ich zurückkam. Und dann funktionierte es nicht mehr.

Ich habe versucht, den 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.


14
Wenn eine Frage SO zu einem bestimmten Produkt mit mehr als 200.000 Ansichten vorliegt, funktioniert das Produkt nicht so, wie es die Benutzer erwarten. Ich würde gerne sehen, dass Microsoft dies anspricht. Hier ist ein Link, um ihnen Vorschläge zu machen, wenn Sie Zeit haben: visualstudio.uservoice.com/forums/121579-visual-studio .
Tony L.

Mein Problem wurde gelöst, indem die aus dem DB-Layer-Projekt kopierte Verbindungszeichenfolge ersetzt wurde.
Hardik

Antworten:


856

Dies bedeutet, dass die Anwendung EDMX nicht laden kann. Es gibt verschiedene Dinge, die dies verursachen können.

  • Möglicherweise haben Sie die MetadataArtifactProcessing-Eigenschaft des Modells in In Ausgabeverzeichnis kopieren geändert.
  • Die Verbindungszeichenfolge könnte falsch sein. Ich weiß, dass Sie sagen, dass Sie es nicht geändert haben, aber wenn Sie andere Dinge geändert haben (z. B. den Namen einer Baugruppe), könnte es immer noch falsch sein.
  • Möglicherweise verwenden Sie eine Nachkompilierungsaufgabe, um den EDMX in die Assembly einzubetten, die aus irgendeinem Grund nicht mehr funktioniert.

Kurz gesagt, Ihre Frage enthält nicht genügend Details, um eine genaue Antwort zu geben, aber hoffentlich sollten diese Ideen Sie auf den richtigen Weg bringen.

Update: Ich habe einen Blog-Beitrag mit vollständigeren Schritten zur Fehlerbehebung geschrieben .


70
Die Connectionstring , trotz meiner Bemühungen mit einem inhalt vergleichen Dienstprogramm letztes Mal zu vergleichen, war falsch.
J. Steen

16
Es war auch für mich die Verbindungsschnur. Wenn Sie Integrationstests haben, für die auch ein Verbindungssting in der eigenen App.config erforderlich ist, können die Dinge beim Aktualisieren Ihres edmx nicht mehr synchron sein.
Ray

11
OK, ich habe es behoben, indem ich einfach "Einbetten" eingestellt habe. Kompilieren und dann auf das andere zurücksetzen. Das hat mein Problem gelöst.
Shimmy Weitzhandler

6
Hatte das gleiche Problem, versuchte Ihre Lösung, wollte +1 geben, erkannte, dass ich es bereits in der Vergangenheit getan habe. Ich erinnere mich nicht einmal daran, dieses Problem vorher gehabt zu haben;). Diesmal war es in meinem Fall die richtige Verbindungszeichenfolge in der Klassenbibliothek mit edmx und falsch in der Webanwendung, als sie verwendet wurde.
Episodex

9
Super Anleitung. Für mich hatte ich eine andere Verbindungszeichenfolge kopiert, die res: // * / Database.MyModel2 ... verwendete, als ich WIRKLICH res: // * / MyModel1 ... wollte (Datenbank ist ein Ordner in meinem Integrationstests-Projekt)
Emragins

360

Diese kleine Änderung hilft bei diesem Problem.

Ich habe Lösung mit 3 Projekt.

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

ändern

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

11
Es hat es für mich behoben, aber was zum Teufel bedeutet es?
Lance Fisher

18
@Lance: Ich erkläre dies ausführlich in diesem Blog-Beitrag
Craig Stuntz

4
@jocull: Nein, es wird in vielen Fällen nicht funktionieren und in anderen langsam sein. Lesen Sie meinen Blog-Beitrag, um zu verstehen, warum.
Craig Stuntz

6
Verschob meine .edmx in den Modellordner und vergaß, die Verbindungszeichenfolge zu aktualisieren. Großartiger Zeiger. Vielen Dank. Ich hätte Stunden gebraucht, um das herauszufinden.
Muruge

11
Sie, Sir, haben einen armen Microsoft-Mitarbeiter vor einem sehr verärgerten Verbraucher gerettet.
Der Muffin-Mann

115

Sie können diese Ausnahme erhalten, wenn sich der Edmx in einem Projekt befindet und Sie ihn von einem anderen verwenden.

Der Grund ist Res://*/ein Uri, der auf Ressourcen in der CURRENT-Assembly verweist. Wenn der Edm in einer anderen Assembly als der Code definiert ist, 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). Z.B:

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

Eine bessere Möglichkeit zum Erstellen von Verbindungszeichenfolgen ist 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 im Reflektor und überprüfen Sie die Dateinamen für Ihre CSDL-, SSDL- und MSL-Dateien. Wenn die Ressourcen andere Namen haben als die im Metadatenwert angegebenen, funktioniert dies nicht.


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

5
MSDN sagt, der zweite Absatz sei falsch. "Wenn Sie einen Platzhalter (*) verwenden, muss das Entity Framework alle Assemblys nach Ressourcen mit dem richtigen Namen durchsuchen."
Craig Stuntz

Ich bin mir ziemlich sicher, dass der Namespace nicht relevant ist, aber der Pfad der eingebetteten Datei. Selbst wenn Sie die Datei * .Designer.cs der zugehörigen edmx-Datei überprüfen und feststellen, dass der automatisch generierte Klassennamensraum MyCompany ist, sollten Sie ihn nicht verwenden. Stattdessen lautet der Pfad Assemblyname, Name des Lösungsordners / Dateinamens. Zum Beispiel: "metadata = res: // * / EntityModels. <Dateiname> .csdl |" + "res: // * / EntityModels. <Dateiname> .ssdl |" + "res: // * / EntityModels. <Dateiname> .msl;"
Daniel

1
@ Daniel, das ist meistens richtig, aber beachte, dass der Namespace und der eingebettete Dateipfad manchmal identisch sind. Sie müssen mit Reflector (oder einer kostenlosen Alternative dazu) suchen, um sicherzugehen.
Craig Stuntz

Es sieht so aus, als würde es nur mit dem Namen der Assembly funktionieren, ohne Version, Publickeytoken usw. Wie:res://MyAssembly/folder.<filename>.csdl...
Ivan Ferrer Villa

67

Ich hatte einen ähnlichen Fehler. Ich hatte das Projekt neu erstellt (lange Geschichte) und alles aus dem alten Projekt übernommen. Ich hatte vorher nicht bemerkt, dass sich mein Modell in einem Verzeichnis namens "Model" befand und jetzt in einem Verzeichnis namens "Models". Sobald ich die Verbindung in meiner Web.Config von diesem geändert habe:

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

dazu:

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

Alles hat funktioniert (geändert Modelin Models). Beachten Sie, dass ich diese drei Stellen in dieser Zeichenfolge ändern musste.


2
Ich habe mein Entity Framework-Modell von Model nach DAL verschoben. Aber dann, als ich einen Test (eine Woche später) in das Testprojekt schrieb, um den Linq Predicatebuilder zu testen. Ich habe diesen Fehler bekommen. Ich habe die Testprojekte App.config so korrigiert, wie sie in der web.config des Hauptprojekts aussahen - wie Sie an drei Stellen sagten. Ihre einfache Antwort hat mich also auf den richtigen Weg gebracht.
Patrik Lindström

Ja, danke - überprüfen Sie Ihre Dateinamen. Irgendwie hatte ich den alten Namen.
PeterX

7
Gibt es einen Unterschied zwischen den beiden?!
Erwin Rooijakkers

2
@ErwinRooijakkers Model vs ModelS
Marc

Ich habe herausgefunden, dass ich nach dem Lesen von Craigs Blog dasselbe getan habe, aber +1 zum Lernen ist es wichtig zu bedenken, dass Änderungen, die in Ihrer Klassenbibliothek "Entitäten" vorgenommen wurden, nicht automatisch in den Konfigurationsdateien von Projekten vorgenommen werden, die darauf verweisen. Ich bin froh, dass ich nicht allein bin.
Ruffin

26

Und eine schnelle Möglichkeit, den Modellnamen ohne Reflektor zu überprüfen ... suchen Sie nach dem Verzeichnis

... obj / {config output} / 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.

Zum Beispiel befinden sich meine drei Ressourcendateien in einem Unterverzeichnis Daten , daher musste meine Verbindungszeichenfolge sein

metadata = res: // * / Data .MyModel.csdl | res: // * / Data .MyModel.ssdl | res: // * / Data .MyModel.msl;

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


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

Tolle Antwort, erklärt tatsächlich, wie man herausfindet, was Ihre Saite ist. Und zeigt, dass Unterordner '.' als Trennzeichen und nicht '\' oder '/'.
cjb110

16

Ich hatte auch dieses Problem und es lag daran, dass sich der Verbindungsstring in meiner web.config geringfügig von dem in der app.config der Assembly unterschied, in der sich mein EDMX befindet. Keine Ahnung warum es sich geändert hat, aber hier sind die zwei verschiedenen Versionen.

App.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SMCSModel.csdl|res://*/Model.SMCSModel.ssdl|res://*/Model.SMCSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Web.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SCMSModel.csdl|res://*/Model.SCMSModel.ssdl|res://*/Model.SCMSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Was behoben wurde, war einfach das Kopieren der app.config-Zeichenfolge (beachten Sie den kleinen Unterschied am Ende - anstelle von " App=EntityFramework" es wollte " application name=EntityFramework") in die web.config und das Problem wurde gelöst. :) :)


1
Danke, das war in der Tat mein Problem. Ich hatte 1 Projekt, das mit EF auf DB zugreift, und ein anderes Projekt WCF. Nach dem Ändern des Namens des ersten Projekts wurde der connectionString in der App.config meines ersten Projekts geändert. Also musste ich den connectionString im Projekt WCF auch in der web.config ändern :)
Volkan

Aus der MSDN-Dokumentation zu docs.microsoft.com/en-us/dotnet/framework/data/adonet/… : The .NET Framework data provider for SQL Server (SqlClient) supports many keywords from older APIs, but is generally more flexible and accepts synonyms for many of the common connection string keywords.Entity Framework-Verbindungszeichenfolgen teilen diese Flexibilität nicht, sodass Sie nur die erwarteten Schlüsselwörter verwenden müssen.
Suncat2000

13

Dies ist mir passiert, als ich versehentlich die Build-Aktion der edmx-Datei (wird in der IDE unter Eigenschaften angezeigt) von 'EntityDeploy' auf 'None' umgestellt habe. EntityDeploy füllt die Metadaten für Sie: siehe http://msdn.microsoft.com/en-us/library/cc982037.aspx


Dies war mein Fix - ich habe mein edmx beim Kopieren in .old umbenannt und einige Dinge ausprobiert. Als ich es wieder umbenannte, setzte die Build-Aktion es selbst auf none und bekam diesen Fehler, wodurch es wieder auf EntityDeploy zurückgesetzt wurde mein Problem :)
eth0

Ich hatte meine EDMX-Datei in einen anderen Ordner verschoben und musste die Erstellungsaktion ändern, damit auch die Namen der eingebetteten Ressourcen aktualisiert wurden. Vielen Dank!
David

Dies war die Lösung für mich; Ich hatte diese Einstellung beim Upgrade auf .NET Standard verloren. Danke, dass du meine geistige Gesundheit gerettet hast!
NetherGranite

11

Dies passiert mir, wenn ich die Lösung vor dem Erstellen eines neuen .edmx-Designers nicht bereinige. Vergessen Sie also nicht, die Lösung zu bereinigen, bevor Sie einen neuen .edmx-Designer erstellen. Dies hilft mir, viel mehr Probleme mit diesem zu überspringen. Nachfolgend finden Sie die Navigationsdetails, falls Sie neu in Visual Studio sind.

Klicken Sie auf> Build-> Clean Solution

Klicken Sie dann auf-> Erstellen-> Lösung neu erstellen

Hoffe das hilft. Vielen Dank an alle


8

Ich habe gerade glückliche 30 Minuten damit verbracht. Ich habe das Entities-Objekt umbenannt, den Eintrag in der Konfigurationsdatei umbenannt, aber es gibt noch mehr ... Sie müssen auch den Verweis auf die CSDL ändern

sehr leicht zu übersehen - wenn Sie umbenennen, stellen Sie sicher, dass Sie alles bekommen ...


6

Ich hatte das gleiche Problem. Ich habe in meine konforme DLL mit Reflektor geschaut und festgestellt, dass der Name der Ressource nicht richtig war. Ich habe umbenannt und es sieht jetzt gut aus.


6

In meinem Fall wird dies durch Ändern der Eigenschaften der edmx-Datei gelöst.

  1. Öffnen Sie die edmx-Datei
  2. Klicken Sie mit der rechten Maustaste auf eine beliebige Stelle des EDMX-Designers
  3. Eigenschaften auswählen
  4. Aktualisieren Sie die Eigenschaft "Verarbeitung von Metadatenartefakten" auf "In Ausgabebaugruppe einbetten".

Dies löste das Problem für mich. Das Problem ist, wenn der Container versucht, die Metadaten zu finden, kann er sie nicht finden. Also mach es einfach in der gleichen Baugruppe. Diese Lösung funktioniert nicht, wenn Sie Ihre edmx-Dateien in einer anderen Assembly haben


+1.000.000 das war heute das zugrunde liegende Problem für mich. Probleme bei der Reorganisation von Produkt-Namespaces und der Konsolidierung von Assemblys.
Mike

6

Ich habe einen ganzen Tag mit diesem Fehler verbracht

wenn Sie mit arbeiten n-tear architecture

oder Sie haben versucht, separate Modelsvom EDMXFormular DataAccessLayer zu generierenDomainModelLayer

Vielleicht erhalten Sie diesen Fehler

  1. Der erste Schritt zur Fehlerbehebung besteht darin, sicherzustellen, dass die Verbindungszeichenfolge in webconfig (UILayer)und vorhanden istappconfig (DataAccessLayer) identisch ist
  2. Zweitens ist das sehr wichtig connection string

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

    Was ist das Problem

von wo um alles in der Welt habe ich bekommen ModelWoher in aller Welt habe oder was auch immer .csdl in meiner Verbindungszeichenfolge, wo sind sie?

hier schaue ich unsere lösung auf das bild

Geben Sie hier die Bildbeschreibung ein

hoffe das hilft dir


5

Ich konnte dies in Visual Studio 2010, VB.net (ASP.NET) 4.0 beheben.

Während des Entitätsmodell-Assistenten können Sie die Entitätsverbindungszeichenfolge anzeigen. Von dort aus können Sie kopieren und in Ihre Verbindungszeichenfolge einfügen.

Das einzige was mir fehlte war der "App_Code". in der Verbindungszeichenfolge.

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"

Leider ist die Verbindungszeichenfolge im Assistenten für app.config nicht korrekt. @leqid schlug einen guten Weg vor, um den Pfad zum Modell zu korrigieren.
Der_Meister

5

Nach stundenlangem googeln und dem Versuch, eine der vorgeschlagenen Lösungen zu lösen, funktionierte sie nicht. Ich habe hier mehrere Lösungen aufgelistet. Ich habe auch den notiert, der für mich funktioniert hat. (Ich habe EF Version 6.1.1 und SQL Server 2014 verwendet - aber eine ältere Datenbank)

  1. Erstellen Sie das Projekt neu und versuchen Sie es erneut.
  2. VS schließen und öffnen - ich weiß nicht, wie das funktioniert
  3. Stellen Sie sicher, dass Sie die Verzeichnisse in Ihren ConnectionString aufnehmen, wenn Sie die EDMX-Datei in einem Verzeichnis abgelegt haben. Zum Beispiel befindet sich meine im DAL-Ordner. SO sieht es so aus: connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;(Dies sind Dateien. Um sie zu sehen, können Sie im Lösungs-Explorer unter ~ / obj / .. das Verzeichnis Alle Dateien anzeigen umschalten.)

... und viele mehr, die ich versucht hatte [wie: Zurücksetzen der EntityFramework-Version auf eine spätere Version (nicht sicher)]


Was hat bei mir funktioniert:

Von diesem Artikel hier hat es mir geholfen, mein Problem zu lösen. Ich habe gerade meine geändert , ProviderManifestToken="2012"um ProviderManifestToken="2008"in der Datei EDMX. Um dies zu tun:

Lösungsforscher

  1. Klicken Sie mit der rechten Maustaste auf die Datei .edmx
  2. Öffnen mit..
  3. Editor XML
  4. Ändern Sie ProviderManifestToken = "XXXX" mit 2008

Ich hoffe das hilft.


Ich hatte kürzlich dieses Problem, nachdem ich scheinbar keine Änderungen vorgenommen hatte. Es wurde versucht, VS ohne Erfolg neu zu starten, aber dann wurde es durch Reinigen und Wiederherstellen behoben. Wenn Sie also für andere keine Änderungen vorgenommen haben und nichts davon relevant erscheint, versuchen Sie es mit einem Clean / Rebuild.
Greg

5

Wenn Sie den edmx aus einem anderen Projekt verwenden, ändern Sie in der Verbindungszeichenfolge ...

metadata=res://*/Data.DataModel.csdl

...zu...

metadata=res://*/DataModel.csdl

Dies ist wahr. Wenn Sie es in Ihren neuen Projektunterordner verschieben möchten, müssen Sie das folder.subfoldervorher hinzufügen .
Qakmak

Danke, diese Lösung hat bei mir funktioniert. Ich hatte meine .edmx-Datei aus einem Verzeichnis in einem Projekt in das Stammverzeichnis eines anderen Projekts verschoben und musste den Verzeichnisnamen aus allen Verbindungszeichenfolgen in meiner Lösung entfernen.
Chris

4

Die ultimative Lösung (auch nach dem Neuerstellen der Datenbank auf zwei anderen Computern sowie dem EDMX und anderen Kleinigkeiten) bestand darin, die erste Ausgabe von Entity Framework nicht zu verwenden. Ich freue mich darauf, es in .NET 4.0 erneut zu evaluieren.

Nachdem ich wieder auf das gleiche Problem gestoßen bin ich und überall nach einer Antwort gesucht hatte, fand ich endlich jemanden, der das gleiche Problem hatte. Es scheint, dass die Verbindungszeichenfolge vom Assistenten von Visual Studio nicht korrekt generiert wurde und dem Link zu den Metadatenressourcen ein wichtiger Pfad fehlte.

v1.0 BUG?: Die angegebene Metadatenressource kann nicht geladen werden. Skripte! = Modelle

Update 2013-01-16 : Nach der Umstellung auf fast ausschließlich EF Code First-Verfahren (auch bei vorhandenen Datenbanken) ist dieses Problem kein Problem mehr. Für mich war dies eine praktikable Lösung, um die Unordnung durch automatisch generierten Code und Konfiguration zu reduzieren und meine eigene Kontrolle über das Produkt zu verbessern.


4

Mein Problem und meine Lösung, die Symptome waren die gleichen "Die angegebene Metadatenressource konnte nicht geladen werden", aber die Grundursache war unterschiedlich. Ich hatte 2 Projekte in Lösung, eines war das EntityModel und das andere die Lösung. Ich habe die EDMX-Datei im EntityModel tatsächlich gelöscht und neu erstellt.

Die Lösung bestand darin, dass ich zum Webanwendungsprojekt zurückkehren und diese Zeile in die Konfigurationsdatei einfügen musste. Das neue Modell hatte einige Elemente geändert, die in der Web.Config-Datei des "anderen" Projekts dupliziert werden mussten. Die alte Konfiguration war nicht mehr gut.

     <add name="MyEntities"
     connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;
                    provider=System.Data.SqlClient;
                    provider connection string=&quot;
                    data source=Q\DEV15;initial catalog=whatever;
                    user id=myuserid;password=mypassword;
                    multipleactiveresultsets=True;
                    application name=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />

4

Manchmal sehe ich diesen Fehler in meinem Projekt. Ich löse das durch

1 - Klicken Sie mit der rechten Maustaste auf die EDMX-Datei

2 - Run Custom ToolOption auswählen

3 - Projekt neu erstellen


Das hat bei mir funktioniert, aber ich musste auch danach wieder aufbauen
am

3

In meinem Fall hing dieses Problem mit dem Umbenennen der edmx-Datei meines Modells zusammen. Das Korrigieren der Verbindungszeichenfolge app.config für die Dateien csdl / ssdl / msl hat mein Problem behoben.

Wenn Sie den EF 4.0-Designer zum Generieren Ihrer csdl / ssdl / msl verwenden, werden diese 3 "Dateien" tatsächlich in der edmx-Hauptdatei des Modells gespeichert. In diesem Fall ist der Beitrag von Waqas ziemlich genau richtig. Es ist wichtig zu verstehen, dass "Model_Name" in seinem Beispiel in den aktuellen Namen der .edmx-Datei Ihres Modells (ohne die .edmx) geändert werden muss.

Wenn sich Ihre edmx-Datei nicht auf der Stammebene Ihres Projekts befindet, müssen Sie Model_Name den relativen Pfad voranstellen, z

res://*/MyModel.WidgetModel.csdl|res://*/MyModel.WidgetModel.ssdl|res://*/MyModel.WidgetModel.msl

würde angeben, dass csdl / ssdl / msl xml in der Modelldatei 'WidgetModel.edmx' gespeichert ist, die in einem Ordner namens 'MyModel' gespeichert ist.


3

Ich habe diese Hilfsklasse geschrieben, um Instanzen von ObjectContext-Objekten zu erstellen, wenn sie in einem anderen Projekt als dem Projekt definiert sind, das es verwendet. Ich analysiere die Verbindungszeichenfolge in der Konfigurationsdatei und ersetze '*' durch den vollständigen Assemblynamen.

Es ist nicht perfekt, weil es Reflexion verwendet, um das Objekt zu erstellen, aber es ist die allgemeinste Methode, die ich finden konnte.

Hoffe es hilft jemandem.

public static class EntityHelper<T> where T : ObjectContext
{
    public static T CreateInstance()
    {
        // get the connection string from config file
        string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString;

        // parse the connection string
        var csBuilder = new EntityConnectionStringBuilder(connectionString);

        // replace * by the full name of the containing assembly
        csBuilder.Metadata = csBuilder.Metadata.Replace(
            "res://*/",
            string.Format("res://{0}/", typeof(T).Assembly.FullName));

        // return the object
        return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T;
    }
}

3

Für euch alle SelftrackingEntitiesWenn Sie Benutzer dem Microsoft Walk-through gefolgt sind und die Objektkontextklasse in das wcf-Dienstprojekt getrennt haben (indem Sie auf den Kontext .tt verlinken), ist diese Antwort für Sie:

Teil der angezeigten Antworten in diesem Beitrag, der Code enthält wie:

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

WIRD NICHT FÜR SIE ARBEITEN !! der YourObjectContextType.Assemblygrund ist, dass sich jetzt in einer anderen assembley befindet (innerhalb der wcf-projekt-Assembly),

Sie sollten also durch YourObjectContextType.Assembly.FullName -> ersetzen

ClassTypeThatResidesInEdmProject.Assembly.FullName 

habe Spaß.


2

Ich hatte Probleme mit derselben Fehlermeldung. Mein Problem wurde durch Schließen und erneutes Öffnen von Visual Studio 2010 behoben.


2

Hatte das gleiche Problem, weil ich eine Baugruppe umbenannt habe.

Ich musste es auch in den Attributen AssemblyTitle und AssemblyProduct in Projekteigenschaften / AssemblyInfo.cs umbenennen und den Verweis auf die edmx-Datei löschen und erneut hinzufügen.

Dann hat es gut funktioniert.


2

Mit dem gleichen Problem habe ich edmx aus der Datenbank neu erstellt. Löst mein Problem.


2
Leider adressiert und behandelt das das Symptom, nicht die Ursache.
Clarice Bouwer

2

Eine Ausnahme ist, dass der Compiler auf nicht vorhandene Metadaten verweist. Kopieren Sie daher einfach den app.config Verbindungsstring in den Web.configConnectionString


1

Ich hatte auch das gleiche Problem und die gleiche Lösung wie Rick, außer dass ich eine vorhandene .edmx in ein neues Projekt importierte, und obwohl der Basis-Namespace keine Rolle spielte, wurde er in ein anderes Unterverzeichnis importiert, sodass ich auch die Verbindung aktualisieren musste Zeichenfolge in Web.Config an drei Stellen, um die verschiedenen Namen der Unterverzeichnisse einzuschließen:


1

Ich hatte das gleiche Problem mit einer Lösung, die Projekte in einem Lösungsordner enthielt, als sie in den Lösungsstamm verschoben wurden (um einen vermuteten Fehler mit dem Mvc3AppConverter aufgrund von Projektpositionen zu beheben).

Obwohl die Lösung kompiliert wurde, nachdem alle * Projektreferenzen nach Bedarf erneut hinzugefügt wurden, wurde der Fehler beim Starten der Website ausgelöst.

Der EDMX befindet sich in einem der Projekte, die verschoben wurden (das 'Daten'-Projekt), aber das Fehlen eines Verweises auf das Datenprojekt verursachte natürlich keinen Kompilierungsfehler, sondern nur einen Laufzeitfehler.

Durch einfaches Hinzufügen des fehlenden Verweises zum primären Projekt wurde dieses Problem behoben, sodass die Verbindung überhaupt nicht bearbeitet werden musste.

Ich hoffe das hilft jemand anderem.


1

Ich hatte die Datenzugriffsschicht und die Benutzerschnittstellenschicht getrennt. Ich habe also eine Entitätsverbindungszeichenfolge für jede Schicht.

Bevor ich diese beiden getrennten Verbindungszeichenfolgen so ändere, dass sie gleich sind, habe ich den folgenden Fehler immer noch festgestellt.

Unable to load the specified metadata resource

Also mache ich die gleichen Verbindungszeichenfolgen für diese beiden Ebenen (DAL, UI). Es funktioniert perfekt.

Meine Lösung besteht darin, alle Verbindungszeichenfolgen gleich zu machen, unabhängig davon, wo sie bereits dargestellt wurden .


1

Ich hatte gestern dieses Problem und habe mir meinen Code im Debug und die Ausgabe von SQL Profiler angesehen.

Was ich nicht verstehen konnte, bevor ich diesen Beitrag gelesen und verstanden habe, war, warum EntityFramework diesen Fehler beim Aufrufen der Datenbank auslöste. Ich habe Hunderte von Zeilen in SQL Profiler durchgesehen, um herauszufinden, was mit dem Datenbankmodell nicht stimmte. Ich konnte so etwas wie den erwarteten Anruf nicht finden, und um ehrlich zu sein, war ich mir nicht sicher, wonach ich suchte.

Wenn Sie sich in dieser Position befinden, überprüfen Sie die Verbindungszeichenfolge. Ich vermute, dass EntityFramework, bevor es seine SQL erstellt, das Modell überprüft, das im Metadatenteil der Verbindungszeichenfolge angegeben ist. In meinem Fall war es falsch. EntityFramework schaffte es nicht einmal bis zur DB.

Stellen Sie sicher, dass die Namen korrekt sind. Nachdem ich das geklärt hatte, sah ich Aufrufe in SQL Profiler, bei denen der Anwendungsname 'EntityFramework' war und SQL die erwarteten Tabellen aufrief.


1

Eine schlechte app.config- oder web.config-Datei kann dies tun. Ich habe die Verbindungszeichenfolge app.config in meine web.config in meiner Benutzeroberfläche kopiert und am Ende Folgendes eingegeben:

<connectionStrings>
    <connectionStrings>
          <add name="name" connectionString="normalDetails"/>
    </connectionStrings>
</connectionStrings>
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.