2009-06-11 21 views
15

Tenemos una solución que consta de dos proyectos: un proyecto de aplicación de consola y un proyecto de aplicación web. Cada uno de estos tiene un esquema idéntico, pero con un nombre diferente al archivo .edmx utilizado para acceder a la misma base de datos.Error de Entity Framework - "El nombre de EntityContainer debe ser único"

La aplicación de consola se ejecuta como una tarea programada en el mismo servidor donde se aloja la aplicación web. La aplicación web contiene una referencia a la aplicación de la consola, ya que ciertas acciones dentro de la aplicación web conducen a métodos en la aplicación de la consola a la que se llama. Esta combinación se ha estado ejecutando correctamente en nuestro entorno de ensayo durante muchos meses.

cuando se libera vivo estamos viendo el siguiente mensaje de error al menos una vez al día:

esquema especificado no es válido. Errores:

ProjectName.csdl (3,4): error 0019: El nombre de EntityContainer debe ser único. Un EntityContainer con el nombre 'ProjectEntities' ya está definido en . ProjectName.csdl (63,4): error 0019: cada nombre de tipo en un esquema debe ser único. El nombre de tipo 'ProjectModel.DataSource' ya estaba definido en . ProjectName.csdl (75,4): error 0019: cada nombre de tipo en un esquema debe ser único. El nombre del tipo 'ProjectModel.Error' ya estaba definido en .

Esto continúa, enumerando todos los nombres de tipo en nuestro esquema.

Este error se puede solucionar reciclando el grupo de aplicaciones o reiniciando IIS.

Tenga en cuenta que el error no se produce hasta que la aplicación web ha estado ejecutándose durante un tiempo; no ocurre cuando compilamos o la primera vez que accedemos a la aplicación.

Mi teoría inicial era que los dos Contenedores de Entidades están en conflicto entre sí porque la aplicación web hace referencia a la aplicación de consola, pero tienen diferentes nombres, lo que hace que el error "El nombre de EntityContainer debe ser único. Un EntityContainer con el nombre 'ProjectEntities' ya está definido como "confuso".

+0

Revise este enlace [1]: http://stackoverflow.com/questions/4898794/the-entitycontainer-name-must-be-unique-in-different-assemblies, esto funciona para mi. ¡Espero ayudarte! –

Respuesta

15

Cuando me enfrenté a este problema en el pasado, siempre he creado una tercera biblioteca compartida que contiene el modelo de entidad, de esa manera usted sabe que no va a haber un conflicto de nombres, si decide agregar una nueva tabla/column/method al modelo solo necesita hacerlo una vez, etc., etc.

+0

Este es el enfoque que hemos tomado para resolver el problema. – ENX

+0

@ENX quizás pueda marcarlo como respuesta entonces. – icelava

+0

@icelava - @ ENX no se ha visto durante más de un año y medio :(Siempre se puede votar para reforzar la respuesta;) –

2

Este error se produce cuando tiene más de una entidad model.edmx en una sola DLL o proyecto de biblioteca de clase. Aunque no conozco la razón del error, puede solucionarlo eliminando el otro modelo o moviendo el otro archivo model.edmx a otra biblioteca de clases.

También no se olvide de quitar las referencias de la DLL anterior

2

Bueno, en mi caso estoy trabajando arquitectura de software diferent, porque tengo diferentes proyectos (DLL), que acceder a la misma base de datos, pero tener diferentes entidades dentro. Entonces, cuando tengo referencias en un proyecto que necesita todas o al menos dos de ellas, obtengo este error

Si cambio el nombre del contenedor de la entidad en cada una, resuelvo el problema, pero ahora mi cadena de conexión es diferente y tengo que incluir todas las cadenas de conexión en el archivo de configuración para cada DLL a la que me refiero.

24

Vaya a esa carpeta bin y elimine el archivo dll y pdb manualmente.

+4

Esto funcionó para mí. Cambié el nombre de una biblioteca de clase y el antiguo dll todavía estaba en la carpeta bin. – wmcainsh

+0

¡Esto también funcionó para mí! –

+0

Esto funcionó para mí también, eliminé todos los archivos dll existentes en la carpeta que estoy usando para publicar mi aplicación. – ravithejag

0

Tenga en cuenta que cuando trate de cambiar el nombre de un contenedor de entidad a un contenedor de entidad previamente eliminado, deberá acceder a su web.config o app.config y eliminar la cadena de conexión de la sección de configuración.

3

Por si acaso alguien más está desesperado y no encuentra ninguna respuesta, accidentalmente terminé con una copia de mi archivo .edmx incluido en el proyecto en una segunda ubicación. Ambos fueron incluidos en la construcción.

;-)

Si esto te ha pasado, no temas: Usted no era la primera.

0

La carpeta Bin para mí estaba oculta, por lo que tuve que mostrar los archivos ocultos, eliminar dlls/pdb antiguos e incluir en el proyecto los que necesitaba. Reconstruido, funciona.

5

Cambiar el archivo de entrada webconfig cadena de conexión de esta entidad

metadata=res://*/App_Code.AAA.csdl|res://*/App_Code.AAA.ssdl|res://*/App_Code.AAA.msl;provider=System.Data.SqlClient;provider connection string="data source=XXX;initial catalog=XXX;user id=XXX;password=XXX;multipleactiveresultsets=True;App=EntityFramework"" 
providerName="System.Data.EntityClient 

a

metadata=res://MyProject/App_Code.AAA.csdl|res://MyProject/App_Code.AAA.ssdl|res://MyProject/App_Code.AAA.msl;provider=System.Data.SqlClient;provider connection string="data source=XXX;initial catalog=XXX;user id=XXX;password=XXX;multipleactiveresultsets=True;App=EntityFramework"" 
providerName="System.Data.EntityClient 
+0

Esto funcionó perfectamente en mi situación: una aplicación utiliza dos bibliotecas (una especie de arquitectura de complemento) que incluyen una referencia "ILMerged" a la misma biblioteca de modelos. Muchas gracias. –

0

que fija esta cuestión en ADO.NET Entity Framework 6.0.

  1. Durante la creación de los modelos, asigno el nombre .edmx al nombre de las entidades. es decir (MYDbEntities)

  2. Después de la creación, abro el MYDbEntities.Context.cs y modifico la clase "Entities" en "MYDbEntities".

  3. Abra el app.config y buscar la cadena de conexión
  4. Abrir las MYDbEntities.Context.cs y cambiar la cadena de conexión a la cadena de conexión de la configuración. ejemplo "MyDbConnection"
  5. Asegúrese de que la cadena de conexión es como esta

    de metadatos = res: // /MYDbEntities.csdl|res:// /MYDbEntities.ssdl|res://*/MYDbEntities .msl; provider = System.Data.SqlClient; provider connection string = " data source =. initial catalog = YourDb; persist security information = True; id de usuario = sa; contraseña = Sw0rdf! sh; multipleactiveresultsets = True; application name = ADO.NET Entity Framework "

Nota: mis entidades reside en un archivo DLL separada.

Espero que esto ayude.

Cuestiones relacionadas