wake-up-neo.com

Der EntityContainer-Name muss eindeutig sein. Ein EntityContainer mit dem Namen 'Entities' ist bereits definiert

Für ein wenig Hintergrund:

Ich habe ein DLL -Projekt mit der folgenden Struktur: 

Rivworks.Model (project)  
  \Negotiation (folder)  
      Model.edmx (model from DB #1)  
  \NegotiationAutos (folder)  
      Model.edmx (model from DB #2)  

Ich habe die Verbindungszeichenfolgen aus der app.config dieses Projekts in die Datei web.config verschoben. Sie sind nicht im ConnectionString-Abschnitt. Ich besitze stattdessen eine statische Klasse, die einen Teil der web.config-Instanz beansprucht und sie meiner App als AppSettings zur Verfügung stellt. [SettingName]. 

<FeedAutosEntities_connString>metadata=res://*/;provider=System.Data.SqlClient;provider connection string='Data Source=db4;Initial Catalog=RivFeeds;Persist Security Info=True;User ID=****;Password=&quot;****&quot;;MultipleActiveResultSets=True'</FeedAutosEntities_connString>
<RivWorkEntities_connString>metadata=res://*/NegotiationAutos.NegotiationAutos.csdl|res://*/NegotiationAutos.NegotiationAutos.ssdl|res://*/NegotiationAutos.NegotiationAutos.msl;provider=System.Data.SqlClient;provider connection string='Data Source=db2;Initial Catalog=RivFramework_Dev;Persist Security Info=True;User ID=****;Password=&quot;****&quot;;MultipleActiveResultSets=True'</RivWorkEntities_connString>

Ich habe 2 Klassen, eine für jeden Kontext und sie sehen so aus:

namespace RivWorks.Model
{
    public class RivWorksStore
    {
        private RivWorks.Model.Negotiation.Entities _dbNegotiation;

        public RivWorksStore(string connectionString, string metadata, string provider)
        {
            EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
            entityBuilder.ConnectionString = connectionString;
            entityBuilder.Metadata = "res://*/";    // metadata;
            //entityBuilder.Provider = provider;
            _dbNegotiation = new RivWorks.Model.Negotiation.Entities(entityBuilder.ConnectionString);
        }

        public RivWorks.Model.Negotiation.Entities NegotiationEntities()
        {
            return _dbNegotiation;
        }
    }
}

namespace RivWorks.Model
{
    public class FeedStoreReadOnly
    {
        private RivWorks.Model.NegotiationAutos.Entities _dbFeed;

        public FeedStoreReadOnly(string connectionString, string metadata, string provider)
        {
            EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
            entityBuilder.ConnectionString = connectionString;
            entityBuilder.Metadata = "res://*/";    // metadata;
            //entityBuilder.Provider = provider;
            _dbFeed = new RivWorks.Model.NegotiationAutos.Entities(entityBuilder.ConnectionString);
        }

        public RivWorks.Model.NegotiationAutos.Entities ReadOnlyEntities()
        {
            return _dbFeed;
        }
    }
}

Sie werden feststellen, dass die Metadaten in eine kurze Version geschrieben werden. 

Wenn ich diese Zeile in jeder Klasse auskommentiere, erhalte ich diesen Fehler: 

Die angegebene Metadatenressource kann nicht geladen werden.

Wenn ich diese Zeile in jeder Klasse belasse, erhalte ich diesen Fehler: 

Das angegebene Schema ist nicht gültig. Fehler: 

Negotiation.Model.csdl (3,4): Fehler 0019: Der EntityContainer-Name muss eindeutig sein. Ein EntityContainer mit dem Namen 'Entities' ist bereits definiert. 

Ich weiß, es ist etwas Einfaches, etwas Offensichtliches. Irgendwelche Vorschläge sind willkommen ...

36
Keith Barrows

Ihre beiden EDMX-Dateien haben wahrscheinlich denselben Entitätscontainernamen. Sie müssen (mindestens) einen von ihnen ändern. 

Öffnen Sie im GUI-Designer den Modellbrowser. Suchen Sie nach einem Knoten mit der Bezeichnung "EntityContainer: Entities". Klick es. Ändern Sie in den Eigenschaften Name in etwas anderes. Speichern und neu aufbauen.

43
Craig Stuntz

Hijacking dies, da es das Top-Ergebnis von Google für die Fehlermeldung ist. 

Falls jemand anderes auf dieses Problem stößt und nur ein einziges Modell/einen einzigen Kontext verwendet: Dieses Problem trat einmal auf, weil die Assembly, die das Modell/den Kontext enthielt, umbenannt wurde und eine Kopie mit dem vorherigen Namen im Verzeichnis bin der Anwendung blieb. Die Lösung bestand darin, die alte Assembly-Datei zu löschen.

146
jpo

Ich hatte auch das Problem, aber meine Lösung bestand darin, das bin-Verzeichnis zu löschen und die Verbindungszeichenfolge mit dem Entitätscontainernamen zu entfernen. Dann könnte ich meine Entitäten umbenennen und die Verbindungszeichenfolge zurücksetzen.

11
MrFlo

Ich habe mein Projekt umbenannt, aber die alte Datei befand sich noch im Ordner bin. Ich musste nur die alte DLL aus dem bin-Ordner löschen.

4
Rob Sedgwick

In meinem Fall wurde das Problem dadurch verursacht, dass meine Verbindungszeichenfolge in Web.config denselben Namen wie die Entitätscontainerklasse erhielt.

Veränderung

<add name="ConflictingNameEntities" connectionString="metadata=res://*/blahblah

zu

<add name="ConflictingNameEntitiesConnection" connectionString="metadata=res://*/blahblah

und generieren Sie die Containerklasse neu, indem Sie im Projektmappen-Explorer mit der rechten Maustaste auf ConflictingNameModel.Context.tt klicken und auf "Benutzerdefiniertes Tool ausführen" klicken.

3
Dan Bechard

Ich habe einen Weg gefunden, mehrere Container mit dem gleichen Namen (natürlich Namensraum) zu speichern.

In EF5 und VS2012 können Sie drei verschiedene Namespaces festlegen. Zuerst können Sie im Lösungsbrowser auf die edmx-Datei klicken und in den Eigenschaftenfenstern den "benutzerdefinierten Tool-Namespace" festlegen. Sie können auf die * .Context.tt-Datei direkt unter dem edmx klicken und dort einen anderen Namespace festlegen Dank einer eindrucksvollen Antwort von Herrn Stuntz wurde mir klar, dass durch das Öffnen der edmx-Datei und Klicken in das weiße Feld ein weiteres Namensraum-Feld unter "Schema" im Eigenschaftenfenster angezeigt wird.

Denke, wir sind fertig, nicht ganz. Ich weiß, dass Sie das Feld Entity Container Name sehen können und versuchen werden, den Namen dort zu ändern, aber das scheint nicht zu funktionieren. Sie erhalten eine kleine Fehlermeldung, die auftaucht. Stellen Sie sicher, dass alle Ihre edmx-Dateien dort einen eigenen Namespace haben. (Ich habe sichergestellt, dass ich an allen drei Orten einen eindeutigen Namensraum hatte.)

Gehen Sie dann zu Ihrem Modellbrowser und klicken Sie mit der rechten Maustaste auf EntityContainer: Entity, um zu den Eigenschaften zu gelangen und den Namen Ihrer Container zu ändern. Von diesem Fenster aus, wo der Namespace überall festgelegt war, konnte ich mehrere Kontexte mit demselben Namen abrufen. Ich beschäftigte mich plötzlich mit Dingen wie blahcontext und blahcontextcontainer, obwohl sie in verschiedenen Ordnern lagen.

Wenn Sie sehen, dass es ein Namespace-Problem ist. Oder Mangel davon.

3
TombMedia

Ich bin nur darauf gestoßen. Es sieht so aus, als sei das Entity Framework irgendwie in einen schlechten Zustand geraten, was die Tabellen angeht, von denen es glaubte, dass es hinzugefügt werden musste.

Normalerweise erkennt EF nicht, dass eine neue Tabelle erstellt werden muss, bis Sie die Zeile setzen

public virtual DbSet<NewTable> NewTable { get; set; }

in Ihrer Kontextklasse.

EF geriet jedoch irgendwie in einen schlechten Zustand, in dem die bloße Anwesenheit der NewTable-Klasse in meiner Lösung den Eindruck erweckte, dass diese Tabelle generiert werden musste. Zu der Zeit, als die obige Zeile im Kontext dazu führte, dass eine NewTable-Tabelle erstellt wurde, dachte sie bereits, sie hätte es getan, daher der Fehler über doppelte Entitäten.

Ich habe gerade die NewTable-Klasse aus meiner Lösung entfernt, die Dinge kommentiert, damit sie erneut kompiliert werden konnte (zum Glück gab es nicht allzu viel davon), und dann eine neue Migration hinzugefügt, um sicherzustellen, dass sie leer ist, wie es hätte sein sollen. Sobald sich die Dinge wieder in einem besser vorhersagbaren Zustand befanden, fügte ich die NewTable-Klasse wieder in die Lösung ein und die Migration funktionierte gut.

1
d512

Wenn Sie die Webbereitstellung in Visual Studio verwenden, werden die alten DLLs manchmal nicht gelöscht. Ich hatte das gleiche Problem, wechselte zum Web Deployment Package und gab mir keine Probleme.

Um das Problem zu lösen, Entity 6.2.0, VS 2017, einzelnes edmx

Ich habe den Namen meines Modells.edmx in einen anderen Namen geändert, das Projekt erstellt und dann wieder in den ursprünglichen Namen geändert.

0
lloyd

In meinem Fall wurde meine Startprojektdatei (csproj) wahrscheinlich nach dem Zusammenfügen einer Version beschädigt.

Alle Entity-Klassen wurden hinzugefügt:

<Compile Include="Class.cs">
  <DependentUpon>MyModel.tt</DependentUpon>
</Compile>

Nachdem alle relevanten Einträge per Hand entfernt wurden, wurde das Problem behoben.

0
Jos R.

Ich hatte ein ähnliches Problem in meiner asp.net-Website. Um das Problem zu beheben, habe ich absichtlich in einer der cs-Dateien im App-Code Kompilierzeitfehler hinzugefügt, indem ein Semikolon entfernt wurde. Dann habe ich das Kompilierungsproblem behoben, indem erneut Semikolon hinzugefügt wurde.

Dieser Vorgang hat dazu geführt, dass die Anwendung erneut kompiliert wurde. Nachdem dieser Fehler behoben wurde.

0
Sagar Shirke

Die andere Ursache für dieses Problem ist das Hinzufügen eines Modells in einem Lösungsprojekt und das Ändern Ihres Modellprojekts.

--PROJECT A --> MODEL.EDMX

--- WEB CONFIG -->Entity Connection

--PROJECT B

--- WEB CONFIG -->Entity Connection

Später denke ich, dass diese Struktur ein schlechtes Projekt ist.

--PROJECT A
using PROJECT.C;
WEB.CONFIG - USE PROJECT C APP.CONFIG CONNECTIONSTRING 

--PROJECT B
using PROJECT.C;
WEB.CONFIG - USE PROJECT C APP.CONFIG CONNECTIONSTRING 

--PROJECT C  (CLASS LIBRARY) --> MODEL.EDMX 
--- APP.CONFIG -->Entity Connection

Alles war in Ordnung, aber ich bekomme eine Fehlermeldung .Fehlerdetails: Der EntityContainer-Name muss eindeutig sein. Ein EntityContainer mit dem Namen 'Entities' ist bereits definiert

Weil ich vergessen habe, Web.Config-Dateien zu ändern. 

ALTE WEB.CONFIG  

    <add name="donatelloEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=donatello;persist security info=True;user id=1;password=1;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

NEUE WEB.CONFIG  

 <add name="donatelloEntities" connectionString="metadata=res://*/EntityModel.Model.csdl|res://*/EntityModel.Model.ssdl|res://*/EntityModel.Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=donatello;user id=sa;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Dieses Problem ist einfach, kann jedoch Zeitverlust verursachen. Ich wollte ein Beispiel geben. Ich hoffe es ist nützlich. 

Vielen Dank.

0
kepler