web-dev-qa-db-fra.com

Le nom EntityContainer doit être unique. Un EntityContainer avec le nom 'Entities' est déjà défini

Pour un peu de fond:

J'ai un projet DLL avec la structure suivante: 

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

J'ai déplacé les chaînes de connexion de app.config de ce projet vers le fichier web.config. Ils sont pas dans la section ConnectionString. J'ai plutôt une classe statique qui consomme une partie du web.config et les expose à mon application en tant qu'AppSettings. [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>

J'ai 2 classes, une pour chaque contexte et elles ressemblent à ceci:

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;
        }
    }
}

Vous noterez que MetaData est en cours de réécriture en une version courte. 

Lorsque je commente cette ligne dans chaque classe, j'obtiens cette erreur: 

Impossible de charger la ressource de métadonnées spécifiée.

Lorsque je laisse cette ligne dans chaque classe, j'obtiens cette erreur: 

Le schéma spécifié n'est pas valide. Les erreurs: 

Negotiation.Model.csdl (3,4): erreur 0019: le nom de EntityContainer doit être unique. Un EntityContainer avec le nom 'Entities' est déjà défini. 

Je sais que c'est quelque chose de simple, quelque chose d'évident. Toutes les suggestions sont les bienvenues ...

36
Keith Barrows

Vos deux fichiers EDMX ont probablement le même nom de conteneur d’entités. Vous devez changer (au moins) l'un d'entre eux. 

Dans le concepteur d'interface graphique, ouvrez le navigateur de modèle. Recherchez un noeud qui dit "EntityContainer: Entities". Cliquez dessus. Dans Propriétés, remplacez Name par quelque chose d'autre. Sauvegarder et reconstruire.

43
Craig Stuntz

Détournant ceci, puisqu'il s'agit du premier résultat de Google pour le message d'erreur. 

Si quelqu'un d'autre le rencontre alors que vous n'utilisez qu'un seul modèle/contexte: J'ai déjà rencontré ce problème car l'assembly contenant le modèle/contexte a été renommé et une copie portant le nom précédent est restée dans le répertoire bin de l'application. La solution consistait à supprimer l'ancien fichier Assembly.

146
jpo

J'ai eu le problème aussi mais ma solution a été de nettoyer le répertoire bin puis de supprimer la chaîne de connexion avec le nom du conteneur d'entités. Ensuite, je pourrais renommer mes entités et remettre la chaîne de connexion.

11
MrFlo

J'ai renommé mon projet mais l'ancien fichier était toujours dans le dossier bin. Il me suffisait de supprimer l'ancien DLL du dossier bin.

4
Rob Sedgwick

Dans mon cas, le problème était dû au fait que ma chaîne de connexion dans Web.config avait le même nom que ma classe de conteneur d'entités.

Changement

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

à

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

et régénérez la classe de conteneur en cliquant avec le bouton droit de la souris sur ConflictingNameModel.Context.tt dans l'Explorateur de solutions et en cliquant sur "Exécuter l'outil personnalisé".

3
Dan Bechard

J'ai trouvé un moyen de sauvegarder plusieurs conteneurs avec le même nom (namespaced bien sûr).

Dans EF5 et VS2012, vous pouvez définir trois espaces de nom différents. Tout d'abord, vous pouvez cliquer sur le fichier edmx dans le navigateur de la solution. Dans la fenêtre des propriétés, vous pouvez définir "Espace de noms d'outils personnalisé". Vous pouvez également cliquer sur le fichier * .Context.tt situé sous l'edmx et définir un autre espace de noms, puis Grâce à une réponse géniale de M. Stuntz, j'ai compris qu'en ouvrant le fichier edmx et en cliquant dans l'espace blanc, vous obtenez un autre champ d'espace de nom sous Schema dans la fenêtre des propriétés.

Pensez que nous avons terminé, pas tout à fait. Je sais que vous pouvez voir le champ Nom du conteneur d’entité et que vous essayez de changer le nom mais que cela ne semble pas fonctionner, vous obtenez une petite erreur qui apparaît. Assurez-vous que tous vos fichiers edmx ont un espace de noms individuel. (Je me suis assuré d'avoir un espace de noms unique aux trois endroits)

Accédez ensuite à votre navigateur de modèles et cliquez avec le bouton droit de la souris sur EntityContainer: Entity pour accéder aux propriétés et modifier le nom de votre/vos conteneur (s). A partir de cette fenêtre avec l'espace de noms défini partout, j'ai pu obtenir plusieurs contextes avec le même nom. Je m'occupais tout à coup de blahcontext et de blahcontextcontainer, même s'ils se trouvaient dans des dossiers différents.

Quand vous voyez que c'est un problème d'espace de nom. Ou l'absence de.

3
TombMedia

Je viens de courir dans cela. Il semble qu'Entity Framework soit dans un mauvais état en ce qui concerne les tables qu'il pensait devoir ajouter.

Normalement, EF ne reconnaîtra pas qu’une nouvelle table doit être créée avant que vous ne mettiez la ligne.

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

dans votre classe de contexte.

Cependant, EF est en quelque sorte tombé dans un mauvais état où la simple présence de la classe NewTable dans ma solution l'incitait à penser qu'il était nécessaire de générer cette table. Donc, au moment où la ligne ci-dessus dans le contexte l'a déclenchée pour créer une table NewTable, il pensait déjà l'avoir fait, d'où l'erreur concernant les entités en double.

Je venais de supprimer la classe NewTable de ma solution, de commenter les éléments afin de compiler à nouveau (heureusement, rien de tout cela), puis d’ajouter une nouvelle migration pour s’assurer qu’elle était vide comme il aurait dû l’être. Puis, une fois que les choses ont retrouvé un état plus prévisible, j'ai rajouté la classe NewTable dans la solution et l'ajout de la migration s'est bien déroulé.

1
d512

Si vous utilisez le déploiement Web à partir de Visual Studio, il est parfois impossible de supprimer les anciennes DLL. J'ai eu le même problème, je suis passé à Web Deployment Package et je n’ai pas eu de problèmes.

Pour résoudre le problème de Entity 6.2.0, VS 2017, single edmx

J'ai changé le nom de mon model.edmx en un autre nom, j'ai construit le projet, puis je l'ai remis au nom d'origine.

0
lloyd

Dans mon cas, probablement après la fusion d’une version précédente, mon fichier de projet de démarrage (csproj) a été corrompu.

Toutes les classes d'entité ont été ajoutées:

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

Après avoir supprimé toutes les entrées pertinentes à la main, le problème a été résolu.

0
Jos R.

J'ai eu le même problème sur mon site asp.net. Pour résoudre le problème, j'ai volontairement ajouté une erreur de compilation dans l'un des fichiers cs du code de l'application en supprimant un point-virgule, puis j'ai corrigé le problème en ajoutant de nouveau point-virgule.

Ce processus a provoqué une nouvelle compilation de l'application. Une fois cette erreur disparue.

0
Sagar Shirke

L'autre cause de ce problème, votre modèle ajouté dans n'importe quel projet de solution et modifier votre projet de modèle.

--PROJECT A --> MODEL.EDMX

--- WEB CONFIG -->Entity Connection

--PROJECT B

--- WEB CONFIG -->Entity Connection

Plus tard, je pense que cette structure est mauvaise et change de projet.

--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

Tout allait bien, mais je reçois une erreur .Détail de l'erreur: le nom EntityContainer doit être unique. Un EntityContainer avec le nom 'Entities' est déjà défini

Parce que j'ai oublié de changer les fichiers Web.Config. 

OLD 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" />

NOUVEAU 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" />

Ce problème est simple mais peut causer une perte de temps. Je voulais donner un exemple. J'espère que c'est utile. 

Merci.

0
kepler