it-swarm.com.de

MetadataException: Die angegebene Metadatenressource kann nicht geladen werden

Plötzlich bekomme ich immer eine MetadataException beim Instantiieren meiner generierten ObjectContext-Klasse. Die Verbindungszeichenfolge in App.Config sieht korrekt aus - hat sich seit der letzten Änderung nicht geändert - und ich habe versucht, ein neues Modell (edmx-Datei) ohne Änderung aus der zugrunde liegenden Datenbank zu regenerieren.

Hat jemand Ideen?

Weitere Details: Ich habe keine Eigenschaften geändert, ich habe den Namen von Ausgabebaugruppen nicht geändert, ich habe nicht versucht, das EDMX in die Baugruppe einzubetten. Ich habe nur 10 Stunden darauf gewartet, 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.

636
J. Steen

Dies bedeutet, dass die Anwendung das EDMX nicht laden kann. Es gibt mehrere 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ß, Sie sagen, Sie haben es nicht geändert, aber wenn Sie andere Dinge geändert haben (beispielsweise den Namen einer Versammlung), könnte dies immer noch falsch sein.
  • Möglicherweise verwenden Sie eine Aufgabe nach dem Kompilieren, um das EDMX in die Assembly einzubetten, was aus irgendeinem Grund nicht mehr funktioniert.

Kurz gesagt, in Ihrer Frage gibt es nicht genügend Details, um eine genaue Antwort zu geben, aber diese Ideen sollten Sie hoffentlich auf den richtigen Weg bringen.

Update: Ich habe einen Blogbeitrag mit vollständigeren Schritten zur Problembehandlung geschrieben.

803
Craig Stuntz

Diese kleine Änderung hilft bei diesem Problem.

Ich habe Solution with 3 project.

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

ändern

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

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

Der Grund ist, dass Res://*/ ein URI ist, der auf Ressourcen in der CURRENT-Assembly verweist. Wenn der Edm in einer anderen Assembly als dem verwendeten Code definiert ist, funktioniert res: // */nicht, da die Ressource nicht gefunden werden kann. 

Anstelle von "*" müssen Sie stattdessen den vollständigen Namen der Assembly angeben (einschließlich des öffentlichen Schlüssels). Z.B:

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

Ein besserer Weg, Verbindungszeichenfolgen zu erstellen, bietet 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 immer noch auftritt, öffnen Sie die Assembly in Reflector 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 sie nicht.

111
user276695

Ich hatte einen ähnlichen Fehler. Ich hatte das Projekt nachgebaut (lange Geschichte) und alles vom alten Projekt übernommen. Ich hatte nicht gemerkt, dass sich mein Modell zuvor in einem Verzeichnis namens "Model" befunden hatte und jetzt in einem Verzeichnis namens "Models". Sobald ich die Verbindung in meiner Web.Config geändert habe:

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

zu diesem:

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

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

59
Rick Arthur

Und eine schnelle Möglichkeit, um den Modellnamen ohne Reflector zu überprüfen. Suchen Sie nach dem Verzeichnis

... obj/{config output}/edmxResourcesToEmbed

Ü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 Data , daher musste meine Verbindungszeichenfolge sein

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

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

25
leqid

Ich hatte auch dieses Problem und es lag daran, dass der Verbindungsstring in meiner web.config etwas anders war als in der app.config der Assembly, in der sich mein EDMX befindet. Keine Ahnung, warum sich das 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" />

Das Problem, das behoben wurde, war das Kopieren der Zeichenfolge app.config (beachten Sie den kleinen Unterschied am Ende - statt "App=EntityFramework" wollte er "application name=EntityFramework") in die web.config. :)

15
Ghlouw

Dies ist mir passiert, als ich versehentlich die Build-Aktion der edmx-Datei (erscheint unter Eigenschaften in der IDE) von 'EntityDeploy' auf 'None' geändert hat. EntityDeploy enthält die Metadaten für Sie: Siehe http://msdn.Microsoft.com/en-us/library/cc982037.aspx

12
hgcummings

Ich habe gerade glückliche 30 Minuten damit verbracht. Ich hatte 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 ... erhalten.

7
TobyEvans

Ich habe einen ganzen Tag mit diesem Fehler verbracht

wenn Sie mit n-tear architecture arbeiten 

oder Sie haben versucht, separate Models, der durch EDMX generiert wurde, DataAccessLayer zu DomainModelLayer zu bilden. 

vielleicht erhalten Sie diesen Fehler 

  1. Der erste Schritt zur Problembehandlung besteht darin, sicherzustellen, dass die Verbindungszeichenfolge in webconfig (UILayer)und appconfig (DataAccessLayer) identisch ist 
  2. Zweitens was sehr wichtig ist der connection string 

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

    was ist das Problem 

von wo auf der Erde habe ich Modeloder was auch immer .csdl in meiner Verbindungszeichenfolge, wo sie sind

hier schaue ich unsere Lösung auf das Bild 

 enter image description here

hoffe die hilfe dir 

6

Ich hatte das gleiche Problem. Ich schaute in meine erfüllte DLL mit Reflektor und habe gesehen, dass der Name der Ressource nicht richtig war. Ich habe umbenannt und es sieht jetzt gut aus.

6
Pitming

In meinem Fall wird es gelöst, indem die Eigenschaften der edmx-Datei geändert werden.

  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. eigenschaft mit dem Namen "Metadata Artifact Processing" auf "In Output Assembly einbetten" aktualisieren

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

6
user464507

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

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

Das einzige, was mir gefehlt hat, war der "App_Code". in der Verbindungszeichenfolge.

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

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

Nachdem ich das gleiche Problem wieder gefunden hatte und überall nach einer Antwort gesucht hatte, fand ich schließlich jemanden, der das gleiche Problem hatte. Es scheint, dass die Verbindungszeichenfolge vom Assistenten von Visual Studio nicht ordnungsgemäß generiert wurde und der Link zu den Metadatenressourcen einen wichtigen Pfad vermisst.

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 das Durcheinander von automatisch generiertem Code und Konfiguration zu reduzieren und meine eigene Kontrolle über das Produkt zu erhöhen.

4
J. Steen

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

Die Lösung war, dass ich zurück zum Webanwendungsprojekt gehen 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
John Peters

Nach stundenlangem Googeln und Versuchen, keine der vorgeschlagenen Lösungen zu lösen, funktionierte es. Ich habe hier mehrere Lösungen aufgelistet. Ich habe auch den bemerkt, der für mich gearbeitet 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. Schließen und öffnen Sie VS - ich weiß nicht, wie das funktioniert
  3. stellen Sie sicher, dass Sie die Verzeichnisse in ConnectionString angeben, wenn Sie die .EDMX-Datei in einem Verzeichnis abgelegt haben. Meines ist zum Beispiel im DAL-Ordner. SO Es sieht so aus: connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl; (dies sind Dateien. Um sie anzuzeigen, können Sie im Lösungs-Explorer die Option Alle Dateien anzeigen im Verzeichnis ~/obj/.. aktivieren).

... und viele weitere, die ich ausprobiert hatte (wie: Zurücksetzen der EntityFramework-Version auf eine neuere Version (nicht sicher))]


was für mich funktionierte:

von diesem Artikel hier hat es mir geholfen, mein Problem zu lösen. Ich habe gerade meinen ProviderManifestToken="2012" in ProviderManifestToken="2008" in der EDMX-Datei geändert. 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. 

4
ben

Für alle SelftrackingEntities-Benutzer: Wenn Sie dem Microsoft-Walk-through gefolgt sind und die Object-Kontextklasse in Des WSF-Serviceprojekts (durch Verknüpfung mit dem Kontext .tt) getrennt haben, ist diese Antwort für Sie 

ein Teil der Antworten in diesem Beitrag, der folgenden Code enthält: 

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

WERDEN NICHT FÜR SIE ARBEITEN !! Der Grund ist, dass YourObjectContextType.Assembly sich jetzt in einer anderen Assembley befindet (innerhalb der wcf-Projektassembly). 

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

ClassTypeThatResidesInEdmProject.Assembly.FullName 

habe Spaß.

3
Robocide

In meinem Fall bezog sich dieses Problem auf die Umbenennung der edmx-Datei meines Modells ... Die Korrektur der Verbindungszeichenfolge app.config für die Dateien csdl/ssdl/msl hat mein Problem behoben.

Wenn Sie den EF 4.0-Designer verwenden, um Ihre csdl/ssdl/msl zu generieren, werden diese 3 "Dateien" tatsächlich in der edmx-Hauptdatei des Modells gespeichert. In diesem Fall ist der Beitrag von Waqas ziemlich genau das Richtige. 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 die XML-Datei csdl/ssdl/msl in der Modelldatei 'WidgetModel.edmx' gespeichert ist, die in einem Ordner mit dem Namen 'MyModel' gespeichert ist.

3
Janmon

Dies passiert mir, wenn ich die Lösung nicht vor dem Erstellen eines neuen .edmx-Designers säubere. Vergessen Sie also nicht, die Lösung zu reinigen, bevor Sie einen neuen .edmx-Designer erstellen. Dies hilft mir, viele weitere Probleme mit diesem zu überspringen. Im Folgenden finden Sie die Navigationsangaben, wenn Sie mit Visual Studio noch nicht vertraut sind.

Klicken Sie auf-> Build-> Clean Solution

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

Hoffe das hilft. Vielen Dank an alle

3
Liakat Hossain

Ich habe diese Hilfsklasse geschrieben, um Instanzen von ObjectContext-Objekten zu erstellen, wenn diese in einem anderen Projekt als das Projekt definiert werden, in dem sie verwendet werden. 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 bauen, aber es ist die allgemeinste Art, es zu tun, 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
lau

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

2
Adam

Mit demselben Problem habe ich edmx aus der Datenbank ..__ neu erstellt. Löscht mein Problem.

2
صفي

Ausnahme ist, dass der Compiler auf nicht vorhandene Metadaten verweist. Kopieren Sie einfach app.config connectionstring in Web.config ConnectionString

2

Hatte dasselbe Problem, weil ich eine Versammlung umbenannt habe.

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

Dann hat es gut funktioniert.

2

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

<connectionStrings>
    <connectionStrings>
          <add name="name" connectionString="normalDetails"/>
    </connectionStrings>
</connectionStrings>
1
MyDaftQuestions

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 Projektstandorten zu beheben).

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

Das EDMX befindet sich in einem der Projekte, die verschoben wurden (das 'Data'-Projekt). Natürlich hat das Fehlen eines Verweises auf das Data-Projekt keinen Kompilierfehler, sondern nur einen Laufzeitfehler verursacht.

Durch das Hinzufügen des fehlenden Verweises zum primären Projekt wurde dieses Problem behoben. Die Verbindung muss überhaupt nicht bearbeitet werden.

Ich hoffe das hilft jemand anderem.

1
Chris

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

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

...zu...

metadata=res://*/DataModel.csdl
1
Graham Laight

Ich hatte einfach nicht auf meine Klassenbibliothek verwiesen, die die EDMX-Datei enthielt. 

1
PeterX

Ich hatte auch das gleiche Problem und die gleiche Lösung wie Rick, mit der Ausnahme, dass ich eine vorhandene .edmx in ein neues Projekt importierte. Der Basis-Namespace war zwar nicht von Bedeutung, er wurde jedoch in ein anderes Unterverzeichnis importiert. Daher musste ich auch die Verbindung aktualisieren Zeichenfolge in Web.Config an drei Stellen, um die unterschiedliche Benennung des Unterverzeichnisses aufzunehmen:

1
eagle779

Eine andere Ursache für diese Ausnahme ist, wenn Sie eine verwandte Tabelle in eine ObjectQuery einschließen, den falschen Navigationseigenschaftsnamen eingeben.

Beispiel:

var query = (from x in myDbObjectContext.Table1.Include("FKTableSpelledWrong") select x);
0
soslo

Geben Sie einfach path wie folgt anstelle von {Path.To.The.} Ein: res: // /{Path.To.The.}YourEdmxFileName.csdl| res:// / {Path.To.The.} YourEdmxFileName.ssdl | res: // */{Path.To.The.} YourEdmxFileName.msl

0
Pavel Nazarov

Verwenden der Informationen aus diesem Blogpost :

Wie andere schon gesagt haben, res: \\ ist ein Zeiger auf Ihre Ressourcen. Um zu überprüfen, ob die Ressourcennamen korrekt sind, können Sie einen Decompiler wie DotPeek by JetBrains verwenden, um Ihre DLL-Datei zu öffnen und Ihre Resources-Dateien anzuzeigen.

Oder Sie öffnen das Überwachungsfenster, während Sie diesen Code debuggen und in diesen Code einfügen, um ein Array der Ressourcennamen in der aktuell ausgeführten Assembly abzurufen.

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()

Das Format Ihrer Metadatenpfade sollte ungefähr so ​​aussehen:

{mein-Assemblyname}/{möglicherweise-a-namespace}. {Klassenname}. {csdl oder ssdl oder msl}

0
Jared Beach

In meinem Fall hat keine der aufgelisteten Antworten funktioniert und ich poste das hier.

Für meinen Fall, auf Visual Studio aufzubauen und es mit IIS Express auszuführen, funktionierte gut. Bei der Bereitstellung von Nant-Skripts als eigenständige Website gab es jedoch Fehler. Ich habe alle oben genannten Vorschläge ausprobiert und dann festgestellt, dass das durch das Nant-Skript generierte DLL viel kleiner war als das von VS erzeugte. Und dann wurde mir klar, dass Nant die .csdl-, .msl- und .ssdl-Dateien nicht finden konnte. Es gibt also zwei Möglichkeiten, dieses Problem zu lösen. Zum einen müssen Sie die benötigten Dateien kopieren, nachdem sie von Visual Studio generiert wurden, und diese Dateien in die Buildbereitstellung aufnehmen. Geben Sie dann in der Web.config den Pfad an als:

"metadata=~/bin/MyDbContext.csdl|~/bin/MyDbContext.ssdl|~/bin/MyDbContext.msl;provider=System.Data.SqlClient;...."

Es wird davon ausgegangen, dass Sie die Dateien manuell in das bin-Verzeichnis der Website kopiert haben, die Sie ausführen. Wenn es sich in einem anderen Verzeichnis befindet, ändern Sie den Pfad entsprechend . Die zweite Methode besteht darin, EdmGen.exe in Nant-Skript auszuführen, die Dateien zu generieren und sie als Ressourcen hinzuzufügen, wie im folgenden Beispiel beschrieben: https: //github.com/qwer/budget/blob/master/nant.build

0
radkan

Ich hatte die Datenzugriffsschicht und die Benutzeroberflächenschicht getrennt. So habe ich Entity-Verbindungszeichenfolge für jede Schicht.

Bevor ich diese zwei getrennten Verbindungszeichenfolgen so modifiziere, dass sie gleich sind, habe ich immer noch den folgenden Fehler gefunden.

Unable to load the specified metadata resource

Ich mache also die gleichen Verbindungszeichenfolgen für diese beiden Schichten (DAL, UI). Es funktioniert perfekt.

Meine Lösung ist, alle Verbindungszeichenfolgen gleich zu machen, egal wo sie bereits präsentiert wurden.

0
Frank Myat Thu

In meinem Fall lag dies daran, dass ich die Verbindungszeichenfolge mit einem EntityConnectionStringBuilder erstellt hatte. Stellen Sie sicher, dass Ihre Metadaten-Eigenschaft den Modellnamen (einschließlich des Namespaces) verwendet.

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 - Wählen Sie die Option Run Custom Tool

0
MOH3N

Bei der Behebung des Metadatenproblems hatte ich ein Folgeproblem in Form einer Aufrufausnahme, die keine Verbindungszeichenfolge für XXXEntities in app.config finden konnte (wobei mein Ziel keine Abhängigkeit von app.config war). Durch reines Glück fand ich heraus, dass die Referenzierung von System.Data in meinem Unit-Testprojekt diese letzte Hürde genommen hat. Also zusammenfassend:

  1. Verwenden Sie nuget, um Entity Framework in Ihrem Gerätetestprojekt zu installieren.
  2. Stellen Sie sicher, dass auf System.Data.Entity und System.Data verwiesen wird.
  3. Sortieren Sie Ihre Verbindungszeichenfolge wie hier beschrieben.
  4. Übergeben Sie die Verbindungszeichenfolge an Ihren Teilklassenkonstruktor.

Ich habe jetzt meine Metadaten in einer Klassenbibliothek, die von einer Referenz-Datenbank aktualisiert werden kann, und ich kann meine Anwendungs- und Komponententests zur Laufzeit auf eine beliebige Datenbank auf einem beliebigen Server verweisen.

Nachtrag: Als ich meinen edmx in einen Ordner verschoben habe, bekam ich erneut den Fehler. Nach einiger Recherche habe ich festgestellt, dass Ihre Metadatenzeichenfolge folgendermaßen aussehen soll: Metadaten = res: //EPM.DAL/Models.EPM.csdl, wobei EPM.DAL der Name der Assembly ist und EPM.edmx der Modellordner.

0
Jeff Dunlop

Ich habe diese Fehlermeldung erhalten, als meine edmx-Datei durch einen Pre-Build-Befehl gelöscht wurde. Es dauerte eine Weile, bis mir klar wurde, dass es so einfach war.

0
f.cipriani

Ich stehe auch vor diesem Problem, ich reinige und baue eine Lösung neu auf, die gut funktioniert.

0
Yogesh Sharma

Manchmal wird die Assembly, die das Modell enthält, nicht geladen:

    [TestMethod]
    public void TestOpenWithConfigurationAfterExplicit()
    {
        String dummy = typeof(MallApp).Assembly.FullName;  
        //force the Assembly loaded.
        using (DbContext ctx = new DbContext("name=MyContainer))
        {
        }
    }

Der Typ MallApp befindet sich in derselben Assembly wie das Entitätsmodell. Ohne explizites Laden wird ein System.Data.MetadataException geworfen.

0
Smartkid

Meine Theorie ist, dass, wenn Sie mehr als eine edmx-Datei mit demselben Namen haben (z. B. Model1), diese Ausnahme angezeigt wird Ich habe das gleiche Problem, als ich beschloss, alle meine edmx-Dateien (in verschiedenen Projekten) zu benennen ) als Model1, weil ich dachte, sie sollten unabhängig sein.

0
alpav

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

Was ich nicht verstehen konnte, bevor ich diesen Beitrag gelesen und verstanden hatte, war, warum EntityFramework diesen Fehler auslöste, als es die Datenbank aufrief. Ich habe Hunderte von Zeilen in SQL Profiler durchgesehen und versucht herauszufinden, was mit dem Datenbankmodell nicht stimmt. Ich konnte nichts wie den Anruf finden, den ich erwartet hatte, 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. Meine Vermutung ist, dass EntityFramework, bevor es seine SQL erstellt, das im Metadatenteil der Verbindungszeichenfolge angegebene Modell überprüft. In meinem Fall war es falsch. EntityFramework hat es nicht bis zur DB geschafft. 

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

0

Dieses Problem ist nach dem Verschieben einer großen Lösung von einem Ordner in Source Control Explorer in einen anderen aufgetreten. Wir checken den Paketordner nicht in Team Foundation ein, und ich denke, VS hat Pakete automatisch heruntergeladen. Dadurch wurde mein EF-Formular v6.1.2 auf v6.1.3 aktualisiert.

Das Problem wurde behoben, als ich auf die ursprüngliche Version 6.1.2 heruntergestuft wurde.

0
RAM

Ähnliches Problem für mich. Mein Klassenname unterschied sich von meinem Dateinamen. Der erzeugte Verbindungsstring hatte den Klassennamen und nicht den Dateinamen. Die Lösung bestand für mich darin, meine Datei nur umzubenennen, damit sie mit dem Klassennamen übereinstimmt.

0
Rob Sedgwick