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 l'application de ce projet.config pour le web.fichier de configuration. Ils sont Pas dans la section ConnectionString. Au contraire, j'ai 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="****";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="****";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 notez que les métadonnées sont 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.
Quand je quitte cette ligne dans chaque classe, j'obtiens cette erreur:
Le schéma spécifié n'est pas valide. Erreurs:
Négociation.Modèle.csdl (3,4): erreur 0019: le nom EntityContainer doit être unique. Un EntityContainer avec le nom 'Entities' est déjà définis.
Je sais que c'est quelque chose de simple, quelque chose d'évident. Toutes les suggestions de bienvenue...
12 réponses
Vos deux fichiers EDMX ont probablement le même nom de conteneur d'entité. Vous devez changer (au moins) l'un d'entre eux.
Dans le concepteur D'interface graphique, ouvrez le navigateur de modèle. Recherchez un nœud qui dit "EntityContainer: Entities". Cliquez sur elle. Dans Propriétés, changez Name
en autre chose. Enregistrer et reconstruire.
Détourner cela, car c'est le meilleur résultat Google pour le message d'erreur.
Au cas où quelqu'un d'autre rencontrerait cela en n'utilisant 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 avec le nom précédent est restée dans le répertoire bin de l'application. La solution était de supprimer l'ancien fichier d'assemblage.
J'ai eu le problème aussi mais ma solution était de nettoyer le répertoire bin, puis de supprimer la chaîne de connexion avec le nom du conteneur d'entité. Ensuite, je pourrais renommer mes entités et remettre la chaîne de connexion.
J'ai renommé mon projet, mais l'ancien fichier était toujours dans le dossier bin. Je devais juste supprimer l'ancienne DLL du dossier bin.
J'ai trouvé un moyen d'enregistrer plusieurs conteneurs avec le même nom (namespaced bien sûr).
Dans EF5 et VS2012, vous pouvez définir trois espaces de noms différents. Vous pouvez d'abord cliquer sur le fichier edmx dans le navigateur de la solution et dans les fenêtres des propriétés, Vous pouvez définir le "espace de noms de L'outil personnalisé", vous pouvez cliquer sur le*. Context.tt fichier juste en dessous de l'edmx et définissez un autre espace de noms, et enfin grâce à une piste de Mr Stuntz awesome answer, j'ai réalisé qu'en ouvrant le fichier edmx et en cliquant dans l'espace blanc, vous obtenez un autre champ d'espace de noms sous schéma dans la fenêtre Propriétés.
Pense que nous avons terminé, pas tout à fait, je sais que vous pouvez voir le champ Nom du conteneur D'entité et va essayer de changer le nom là-bas, mais 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)
Ensuite, allez dans votre navigateur de Modèle et faites un clic droit sur EntityContainer: Entité pour accéder aux propriétés et modifier le nom de votre(vos) conteneur (s). De cette fenêtre avec l'espace de noms défini partout, j'ai pu obtenir plusieurs contextes avec le même nom. J'avais affaire à des choses comme blahcontext et blahcontextcontainer tout d'un coup, même si elles étaient dans des dossiers différents.
Quand vous voyez que c'est un problème d'espace de noms. Ou l'absence de celui-ci.
Dans mon cas, le problème a été causé par ma chaîne de connexion dans le Web.config étant nommé la même chose que ma classe de conteneur entities.
Modifier
<add name="ConflictingNameEntities" connectionString="metadata=res://*/blahblah
À
<add name="ConflictingNameEntitiesConnection" connectionString="metadata=res://*/blahblah
Et régénère la classe conteneur en cliquant avec le bouton droit de la souris ConflictingNameModel.Context.tt dans L'Explorateur de solutions et en cliquant sur "Exécuter L'outil personnalisé".
Je viens de tomber sur ça. Il semble que Entity Framework soit entré dans un mauvais état en termes de tables qu'il pensait devoir ajouter.
Normalement, EF ne reconnaîtra pas qu'une nouvelle table doit être créée tant que vous n'aurez pas mis la ligne
public virtual DbSet<NewTable> NewTable { get; set; }
Dans votre classe de contexte.
Cependant, EF est tombé dans un mauvais état où la simple présence de la classe NewTable dans ma solution l'a amené à penser qu'elle avait besoin de générer cette table. Donc, au moment où la ligne ci-dessus dans le contexte l'a déclenché pour créer une table NewTable, il pensait déjà l'avoir fait, d'où l'erreur sur les entités en double.
Je viens de supprimer la classe NewTable de ma solution, de commenter les choses pour qu'elle compile à nouveau (heureusement, il n'y en avait pas trop), puis j'ai ajouté une nouvelle migration pour m'assurer qu'elle était vide comme elle aurait dû l'être. Puis, une fois que les choses sont revenues dans un état plus prévisible, j'ai ré-ajouté la classe NewTable dans la solution et ajouté la migration a bien fonctionné.
Si vous utilisez le déploiement web à partir de Visual Studio, les anciennes DLL ne sont parfois pas supprimées. J'ai eu le même problème, changer pour le paquet de déploiement Web et ne m'a pas donné de problèmes.
J'ai eu le même problème dans mon asp.net site web, pour résoudre le problème, j'ai volontairement ajouté une erreur de compilation dans l'un des fichiers cs dans le code de l'application en supprimant un point-virgule, Puis j'ai rectifié le problème de compilation en ajoutant à nouveau un point-virgule.
Ce processus a provoqué une nouvelle compilation de l'application.Après cette erreur a disparu.
L'autre cause de ce problème, votre modèle ajouter dans n'importe quel projet de solution et changer 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 "Entités" est déjà défini
Parce que j'ai oublié de changer Web.Les fichiers de configuration.
VIEUX WEB.CONFIG
<add name="donatelloEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=donatello;persist security info=True;user id=1;password=1;multipleactiveresultsets=True;App=EntityFramework"" 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="data source=.;initial catalog=donatello;user id=sa;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
Ce problème est Simple mais peut entraîner une perte de temps. Je voulais donner un exemple. J'espère, c'est utile.
Merci.
Pour résoudre le problème entité 6.2.0, VS 2017, seul edmx
J'ai changé le nom de mon modèle.edmx à un autre nom, construit le projet, puis le change au nom d'origine.
Dans mon cas, probablement après avoir fusionné une version, mon fichier de projet de démarrage (csproj) a été corrompu.
Al Les classes D'entités 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.