La conexión con nombre especificada no se encuentra en la configuración, no está diseñada para usarse con el proveedor de EntityClient o no es válida

170

Tengo un objeto de marco de una entidad y cuando lo agrego a mi proyecto, connectionstring se agrega app.configen la connectionstringsección, pero cuando quiero crear uno nuevo entitycontexty usarlo connectionstring, aparece este error

usuario421413
fuente
44
Gracias por el enlace, Craig. Sin embargo, voto para mantener este hilo, porque el título fue lo que me ayudó a encontrar el error MetadataException.
jp2code
Esto me sucedió cuando el archivo de configuración no se actualizó con una cadena de conexión por alguna extraña razón.
P.Brian.Mackey

Respuestas:

217

Sospecho que su problema proviene del hecho de que tiene más de un proyecto en su solución y el que contiene los elementos del marco de su entidad, incluidos los edmxarchivos, NO es el proyecto de inicio de las soluciones. En este caso, incluso si la cadena de conexión existe en el app.configproyecto EF , CLR aún no puede encontrarla en tiempo de ejecución. Por ejemplo, si tiene un sitio web y un proyecto de EF en su solución, debe copiar la cadena de conexión de los proyectos de EF app.configa los de su sitio web web.config. Básicamente, cualquier dato de cadena de conexión debe existir en el archivo de configuración del proyecto desde el cual los hilos .Net iniciados por CLR (es decir, su proyecto de inicio). Si este no es su caso, simplemente abra suedmxarchivo, haga clic derecho en su superficie, seleccione propiedades y copie la cadena de conexión y péguela en la app.configsección Cadena de conexión. De esta manera, puede asegurarse de tener la correcta en su configuración.

EDITAR:
Como puede ver aquí en Documenation en ObjectContext Constructor , el primer parámetro es el nombre de la cadena de conexión, que es el código generado en el momento en que crea su EDM. Si, de alguna manera, se cambia el nombre de la cadena de conexiones, todo lo que necesita hacer es hacer clic derecho en su modelo y seleccionar "Actualizar modelo de la base de datos ...", luego siga el asistente para actualizar su confing y diseñador para reflejar esto cambio.

Morteza Manavi
fuente
1
hola Morteza y gracias por tu respuesta, pero anteriormente copié la sectina de la cadena de conexión en web.config, pero el error no está resuelto, pero cuando está en entitymodel.designer reemplaza (public EntityContext (): base ("name = EntityContext", EntityContext " )) con la
cadena de
1
@Morteza, ¿tiene una solución para proyectos en los que el ensamblaje ejecutor no tenga una app.config? En mi caso, el ejecutable de llamada es una aplicación VB6 que llama a mi ensamblaje (donde están los objetos de la entidad) a través de COM Interop.
Perecedero Dave
44
tan simple, pero tan frustrante. Hasta VOTO. ¡Viva el stackoverflow!
granadaCoder
3
Si está utilizando WCF, recuerde incluir la cadena de conexión en su proyecto de servicio
Nathan
1
Gracias Morteza, ¡me ahorró mucho tiempo!
Chris
32

Debe copiar la cadena de conexión en app.config a su web.config, o copiar todo el archivo al proyecto que muestra el resultado. Es una de las condiciones para consumir el marco.

Musikero31
fuente
1
simplemente agregue la misma cadena de conexión (como en el proyecto de acceso a datos) en su web.config (que se encuentra en el proyecto front-end).
Danés
@ Musikero31 Uso EF y defino todas las cadenas de conexión de entidad en el código. No tengo nada en una configuración relacionada con eso.
Keith Beard el
Después de copiar los archivos DAL en un nuevo proyecto, también recibí el error anterior. Mirando más de cerca los archivos de configuración, noté que la cadena de conexión fue reemplazada por EF. Pude copiar / pegar manualmente la cadena de conexión correcta en el nuevo proyecto y funcionó.
Ravi Ram
9

Me encontré con este problema cuando intenté poner mi lógica de base de datos personalizada en un .dll para ser utilizada por múltiples proyectos en mi solución.

Si bien el archivo .dll tenía el archivo app.config correcto, no funcionó. Entity frameworks quería la información de conexión en la aplicación.config del .exe. Copiar la información allí funcionó bien.

La solución de Morteza de pegar la cadena de conexión directamente en el .edmx no funcionó para mí, ya que no me permitía pegar el valor allí, aunque eso es precisamente lo que quería poder hacer.

Walt Stoneburner
fuente
3
Aunque solo había un app.config (y ese era el único archivo de configuración en ese directorio) en el directorio de mi exe, no lo leería. Tuve que cambiar el nombre del archivo myExe.exe.config
Mario
6

Hola, tuve este problema y me estaba volviendo loco. De todos modos, finalmente descubrí cuál era el problema. Lo primero que tiene que hacer es asegurarse de que el connectionstringsen app.configy web.configson los mismos. Luego debe hacer doble clic en el .edmxarchivo para poder ver las tablas. Una vez que haga clic en cualquier lugar cerca de las tablas, pero no en las tablas, vaya a las propiedades. En la lista desplegable, seleccione ConceptualEntityModely busque el Nombre del contenedor de la entidad y recuérdelo bien.

A continuación, vaya al diseñador del archivo edmx y abra los constructores. (el diseñador es la subcarpeta del archivo edmx) los constructores deben tener dos parámetros en el parámetro BASE

public DBEntities() : base("name=DBEntities", "DBEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

Este es uno de ellos. el primer parámetro debe tener el nombre del archivo del proyecto en el que se encuentra el .edmxarchivo. El segundo parámetro debe tener el nombre del contenedor de la entidad de las propiedades que mencioné anteriormente. no olvide organizar todos los constructores con:base("", "")

Al menos ese era mi problema y mi problema se resolvió así. Espero que puedas resolver el tuyo así.

MaltaCoders
fuente
6

Tenía una variación sobre esto que nadie parecía cubrir.

Tenía un proyecto principal con un par de modelos y un Proyecto de prueba que contenía pruebas unitarias. El Proyecto de prueba estaba funcionando, pero luego se detuvo con el error mencionado en el OP. No había hecho ningún cambio de nombre o movimiento del archivo EDMX.

Muchos de los consejos mencionaron la comparación de archivos .config, pero mi proyecto no tenía ninguno.

Al final, copié el archivo app.config del proyecto principal en mi proyecto de prueba y luego funcionó. Si este es el paso correcto o si presentará problemas de mantenimiento cuando se agreguen modelos adicionales, no lo sé, pero al menos mis pruebas unitarias se están ejecutando correctamente nuevamente ahora.

S. Baggy
fuente
Desde que publiqué esto, me di cuenta de que probablemente sería mejor crear un enlace al archivo app.config de otro proyecto. Pero aún así, el otro enfoque funcionará para solucionar el problema original cuando no haya ningún archivo de configuración.
S. Baggy
4

Aunque la respuesta de Morteza Manavi resuelve este problema, otra solución es construir la cadena de conexión dinámicamente y pasarla al constructor para su ObjectContext:

public static string CreateConnectionString()
{
    var assemblyPath = Assembly.GetExecutingAssembly().Location;
    string assemblyLocation = Path.GetDirectoryName(assemblyPath);
    string dbPath = Path.Combine(assemblyLocation, "YourDatabase.sdf");
    var sqlBuilder = new SqlConnectionStringBuilder { DataSource = dbPath };

    var entityBuilder = new EntityConnectionStringBuilder
    {
        ProviderConnectionString = sqlBuilder.ConnectionString,
        Provider = "System.Data.SqlServerCe.3.5",
        Metadata = @"res://*/YourModel.csdl|
                 res://*/YourModel.ssdl|
                 res://*/YourModel.msl"
    };

    return entityBuilder.ToString();
}

// Snip...

var entityContext = new YourObjectContext(CreateConnectionString());

Esto elimina la necesidad de copiar la información de la cadena de conexión a la configuración de la aplicación de su proyecto de inicio que, al menos en mi caso, no era deseable.

Nick Spreitzer
fuente
4

Olvidé agregar providerName = "System.Data.EntityClient" como atributo en la cadena de conexión. Esto dio lugar a este error, así

<add name="connectionName" connectionString="metadata=res://*/..." providerName="System.Data.EntityClient" />

en vez de

<add name="connectionName" connectionString="metadata=res://*/..." />
Gertjan
fuente
2

Acabo de descubrir que si se crea una aplicación en IIS desde VS2010 a dos niveles desde la raíz del sitio web, se produciría este error. No estoy seguro de por qué sucede, necesitaría investigar más. Por ejemplo, si su aplicación está en esta ruta: /admin/advertiserel error aparecerá si no tiene /adminun directorio virtual en su sitio IIS.

Todo lo que hice fue crear un admindirectorio vacío en mi .../intepub/wwwrooterror desapareció.

Descubrirá que no podrá comenzar a depurar hasta que realice el paso anterior.

Tuvimos este problema en nuestro equipo en el pasado, nos tomó un tiempo recordarlo, pero así fue exactamente como lo solucionamos antes.

Jovica Zaric
fuente
1

Estoy usando n'tier architecture y tengo el mismo problema, pero este me ayuda. Espero que esto te ayude. Primero tiene lo mismo connection stringsobre usted librariesdonde puede acceder a DB como en app.configy web.config después de eso simplemente agrega un constructor sobrecargado en el archivo .edmx (Model.context.cs) que ahora tiene dos constructores, uno es predeterminado y el otro que acaba de agregar ( sobrecargado).

        public YourEntityName(string connString)
            : base(connString)
        {
        }
Muhammad Asad
fuente
1

Tenía una biblioteca de clase que tampoco quería trabajar con EF. Después de copiar el archivo app.config (o solo la sección de conexiones) de mi biblioteca de clases al proyecto exe, ¡la conexión funcionó bien! Probablemente se espera que el archivo de configuración esté en la misma carpeta que el proyecto exe y, por lo tanto, no se encontró. ¡Así que siempre tenga mucho cuidado cuando use un archivo de configuración en un proyecto de biblioteca de clases!

Vincent
fuente
0

Bueno ... este problema podría ser también por una razón muy simple (tonta) ... Copié un archivo de otro proyecto y olvidé cambiar la ConnectionString en EntityDataSource ... ya que estaba al comienzo del proyecto y sucedió en la página de inicio de sesión, pensé que era algo en la configuración, pero era solo el nombre de cadena de conexión incorrecto (y DefaultContainerName).

Gabriel G
fuente