2010-01-13 13 views
32

Para un poco de historia:El nombre de EntityContainer debe ser único. Un EntityContainer con el nombre de 'entidades' ya está definido

Tengo un proyecto DLL con la siguiente estructura:

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

he movido las cadenas de conexión de aplicación de este proyecto. config para el archivo web.config Son no en la sección ConnectionString. Más bien, tengo una clase estática que consume parte de web.config y los expone a mi aplicación como 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> 

tengo 2 clases, una para cada contexto y se ven así:

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

Usted notará que los metadatos se está volviendo a escribir a una versión corta.

Cuando comento hacia fuera de esa línea en cada clase me sale este error:

Unable to load the specified metadata resource.

Cuando salgo de esa línea en cada clase me sale este error:

Schema specified is not valid. Errors:

Negotiation.Model.csdl(3,4) : error 0019: The EntityContainer name must be unique. An EntityContainer with the name 'Entities' is already defined.

Sé que es algo simple, algo obvio. Cualquier sugerencia bienvenida ...

Respuesta

37

Sus dos archivos EDMX probablemente tengan el mismo nombre de contenedor de entidad. Necesita cambiar (al menos) uno de ellos.

En el diseñador de GUI, abra el Navegador de modelos. Busque un nodo que diga "EntityContainer: Entities". Pinchalo. En Propiedades, cambie Name por otra cosa. Guardar y reconstruir

+1

sí - tan simple como eso. (Todavía intenta comprender el modelo general de EF en el nivel de clase (generalmente oculto).) –

+1

También es posible que deba abrir el archivo EDMX en el bloc de notas ya que Visual Studio puede no recoger el cambio correctamente cuando simplemente cambia el nombre del contenedor en el panel de propiedades. –

+0

En mi caso, tenía un archivo EDMX que solté y volví a agregar. Tuve que ir a través del Explorador de modelos => Propiedades para restablecer el nombre del contenedor. –

143

Secuestrar esto, ya que es el resultado principal de Google para el mensaje de error.

En caso de que alguien más lo encuentre usando solo un modelo/contexto: una vez encontré este problema porque el ensamblaje que contiene el modelo/contexto se renombró y una copia con el nombre anterior permaneció en el directorio bin de la aplicación . La solución fue eliminar el archivo de ensamblaje anterior.

+2

Experimenté exactamente el mismo problema después de cambiar el nombre de mi ensamblaje. Necesita eliminar manualmente los archivos antiguos de la carpeta bin ya que Visual Studio ya no los sigue y realizar un "Limpiar" no los eliminará – Chris

+2

Greate, muchas gracias. Tengo el mismo conjunto de diferentes versiones, una en el contenedor del servicio web (4.0.1.0) y otra en el GAC (4.0.1.2). En el archivo de configuración que defino, dos utilizan la versión GAC (Proveedor de funciones personalizadas). Tuve el mismo error que la antigua versión dll había sido eliminada de la carpeta bin. –

+1

Solo para aclarar para otros, el ensamblaje anterior está ubicado en el lado del servidor en la ubicación de implementación. – ChrisO

3

He encontrado una manera de guardar varios contenedores con el mismo nombre (namespaced por supuesto).

En EF5 y VS2012 puede establecer tres espacios de nombres diferentes. Primero puede hacer clic en el archivo edmx en el navegador de soluciones y en las ventanas de propiedades puede configurar el "Espacio de nombres de herramientas personalizadas", puede hacer clic en el archivo * .Context.tt justo debajo de edmx y establecer otro espacio de nombres allí, y finalmente Gracias a una pista de la excelente respuesta del Sr. Stuntz, me di cuenta de que al abrir el archivo edmx y hacer clic en el espacio en blanco, aparece otro campo de espacio de nombres en Esquema en la ventana de propiedades.

Creo que hemos terminado, no del todo, sé que puede ver el campo Entity Container Name y tratará de cambiar el nombre allí, pero parece que no funciona, se obtiene un pequeño error que aparece. Asegúrese de que todos sus archivos edmx tengan un espacio de nombres individual allí. (Me aseguré de tener un espacio de nombres exclusivo en los tres lugares)

Luego vaya a su Navegador de modelos y haga clic derecho en EntityContainer: Entidad para ir a las propiedades y cambiar el nombre de su contenedor (es).Desde esa ventana con el espacio de nombres establecido en todas partes, pude obtener múltiples contextos con el mismo nombre. Estaba lidiando con cosas como blahcontext y blahcontextcontainer de repente a pesar de que estaban en carpetas diferentes.

Cuando vea que es un problema de espacio de nombres. O la falta de ello.

+0

También tuve que cambiar el archivo 'Model.tt' y cambiar el espacio de nombres allí. No estoy seguro de que cambiar el espacio de nombres real de edmx cambie nada ... – Benjol

+0

Extraño, si no configuro el espacio de nombres en el edmx (clic izquierdo en edmx, no clic izquierdo en el espacio en blanco), deja de generar la mitad de mi POCOs.Si lo incluyo, obtengo una clase extra (vacía) 'Model.cs' generada. Si cambio el espacio de nombres con el clic izquierdo en el espacio en blanco * también *, no obtengo nada más que la clase 'Model.cs'. Ngngng – Benjol

+0

Eejit me: en la misma carpeta, por lo que el segundo generado obviamente squishes la primera ... – Benjol

9

Tuve el problema, pero mi solución fue limpiar el directorio bin y luego eliminar la cadena de conexión con el nombre del contenedor de la entidad. Entonces podría cambiar el nombre de mis entidades y volver a poner la cadena de conexión.

+2

+1 Esta es la solución para mí. Eliminar el contenido del contenedor por sí solo no lo resolvió; la parte de la cadena de conexión de esta respuesta hizo el truco. –

4

Cambié el nombre de mi proyecto pero el archivo anterior todavía estaba en la carpeta bin. Solo tuve que eliminar la antigua DLL de la carpeta bin.

1

Me acabo de topar con esto. Parece que de alguna manera Entity Framework entró en mal estado en términos de qué tablas pensó que necesitaba agregar.

Normalmente EF no reconocerá que una nueva tabla tiene que ser creado hasta que coloque la línea

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

dentro de su clase de contexto.

Sin embargo, EF de alguna manera entró en un mal estado en el que la mera presencia de la clase NewTable en mi solución lo hacía pensar que necesitaba generar esa tabla. Entonces, cuando la línea de arriba en el contexto lo activó para crear una tabla NewTable, ya pensó que lo había hecho, de ahí el error sobre las entidades duplicadas.

Acabo de eliminar la clase NewTable de mi solución, comenté las cosas para que se volviera a compilar (afortunadamente no hubo mucho de esto), luego agregué una nueva migración para asegurarme de que estaba en blanco como debería haber sido . Luego, una vez que las cosas volvieron a un estado más predecible, volví a agregar la clase NewTable a la solución y agregar la migración funcionó bien.

0

Tuve un problema similar en mi sitio web asp.net, para resolver el problema Agregué deliberadamente un error de tiempo de compilación en uno de los archivos cs en el código de la aplicación eliminando un punto y coma, luego rectifiqué el problema de compilación agregando un punto y coma de nuevo.

Este proceso provocó que la aplicación volviera a compilarse. Después de que este error desapareció.

0

La otra causa de este problema es agregar el modelo en cualquier proyecto de solución y cambiar el proyecto de modelo.

--PROJECT A --> MODEL.EDMX 

--- WEB CONFIG -->Entity Connection 

--PROJECT B 

--- WEB CONFIG -->Entity Connection 

Más tarde, creo que esta estructura es mala y el proyecto de cambio.

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

Todo estaba bien, pero me sale un error. Detalle del error: El nombre de EntityContainer debe ser único. Un EntityContainer con el nombre 'Entidades' ya está definido

Porque olvidé cambiar los archivos Web.Config.

Web.config VIEJO

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

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

Este problema es simple pero puede causar la pérdida de tiempo. Yo quería dar un ejemplo. Espero que sea útil.

Gracias.

3

En mi caso, el problema se debió a que mi cadena de conexión en Web.config recibía el mismo nombre que mi clase de contenedor de entidades.

Cambio

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

a

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

y regenerar la clase de contenedor haciendo clic derecho en ConflictingNameModel.Context.tt en el Explorador de soluciones y haciendo clic en "Herramienta personalizada Ejecutar".

+0

¡Esto ayudó, debería integrarse en la respuesta de jpo! – Federinik

0

para resolver el problema Entidad 6.2.0, VS 2017, solo edmx

he cambiado el nombre de mi model.edmx a otro nombre, construido el proyecto, pero cambió de nuevo al nombre original.

0

En mi caso, probablemente después de fusionar una versión, mi archivo de proyecto de inicio (csproj) se corrompió.

clases Al la entidad donde ha añadido:

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

Después de quitar todas las entradas pertinentes a mano se resolvió el problema.

0

Si está utilizando la implementación web de Visual Studio a veces no elimina los dlls antiguos. Tuve el mismo problema, cambié a Web Deployment Package y no me dio problemas.

Cuestiones relacionadas