No se pudo encontrar una cadena de conexión llamada 'MyEntities' en el archivo de configuración de la aplicación

246

Estoy usando el framework de entidades y ASP.NET MVC 4 para construir una aplicación

Mi solución se divide en dos proyectos;

  • Una biblioteca de clases que incluye mi archivo de modelo de datos (.edmx) y algunas interfaces personalizadas
  • El proyecto MVC 'contenedor' que hace referencia a la biblioteca de clases anterior

Mi problema es que cuando intento usar el DbContext ' MyEntites ' obtengo el siguiente error:

No se pudo encontrar una cadena de conexión llamada 'MyEntities' en el archivo de configuración de la aplicación.

Supongo que el problema tiene algo que ver con el hecho de que la cadena de conexión se encuentra dentro de la configuración de la aplicación de la biblioteca de clases en lugar del proyecto MVC.

¿Alguien tiene alguna sugerencia?

jjc99
fuente
15
No es exactamente el mismo contexto que el suyo (migraciones automáticas con EF6), pero tuve el mismo problema con un mensaje de error similar cuando creé una rama secundaria en TFS y comencé a trabajar en ella. Marcar el proyecto mvc como proyecto de inicio resolvió esto. salida PM> Update-Database -Verbose Using StartUp project 'xxxxx.Web.Home'. Using NuGet project 'xxxxx.Web.Home.Dal'. Specify the '-Verbose' flag to view the SQL statements being applied to the target database. Target database is: 'MovieDatabase-0.0.2' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration).
Objeto mecánico

Respuestas:

309

Intente copiar la cadena de conexiones al archivo .config en el proyecto MVC.

alemán
fuente
63
Funciona perfecto, pero me encantaría saber por qué el proyecto al que se hace referencia no está utilizando su propio archivo de configuración para recuperar la cadena de conexión.
Null Head
77
@Alexander Antigua pregunta, pero sí, también me gustaría saber por qué.
Kehlan Krumme
22
@Alexander, el marco carga y usa los archivos de configuración para el ensamblaje en ejecución. En este caso, es el proyecto web. Las bibliotecas de clases generalmente no tienen sus propios archivos de configuración.
kiprainey
24
Los comandos Enable-Migration cuando se ejecutan en el contexto de NuGet COnsole, miran el archivo de configuración de Proyectos de inicio, no necesariamente el proyecto en el que pensarían que estaría. Simplemente configure el proyecto con la aplicación.config que desea que sea el inicio proyecto. Opcionalmente, almacene sus cadenas de conexión en un archivo de configuración, luego haga referencia a ellas en otros proyectos mediante <connectionString configSource = "../ ProjectDir / SharedConnections.config" />
Ryan Mann
3
Recibí este mensaje de error exacto, pero mi archivo .config, en el proyecto correcto, de hecho enumeró la cadena de conexión correcta. Sin embargo, estaba usando transformaciones y, por supuesto, la cadena de conexión no estaba referenciada en el archivo .config transformado. Entonces eso es algo a tener en cuenta, si está utilizando transformaciones de archivos de configuración.
Morten Nørgaard
143

Tiene razón, esto sucede porque la biblioteca de clases (donde el archivo .edmx) no es su proyecto de inicio / principal.

Deberá copiar la cadena de conexión al archivo de configuración del proyecto principal.

En caso de que su proyecto de inicio / principal no tenga un archivo de configuración (como en mi caso de Aplicación de consola) simplemente agregue uno (Proyecto de inicio - Agregar nuevo elemento -> Archivo de configuración de la aplicación).

Puede encontrar información más relevante aquí: MetadataException: no se puede cargar el recurso de metadatos especificado

Oren
fuente
8
La respuesta clave a esto es que la biblioteca de clases (donde está el archivo .edmx) no es su proyecto de INICIO. Me di cuenta de que mi proyecto de inicio no estaba configurado para el proyecto que tenía mi web.config. Era una aplicación de consola con una app.config diferente. Entonces, si está agregando aplicaciones de consola a su solución web, asegúrese de que su proyecto web sea el proyecto de inicio cuando ejecute update-database.
Karl
1
He descargado mi proyecto principal por alguna razón y después de volver a cargarlo, recibí este error al intentar agregar migraciones. Hacer que el proyecto de inicio del proyecto principal volviera a resolver el problema. Gracias @Oren
Azadrum
2
Mi proyecto de inicio había cambiado por error. Esa es la clave. ¡Tu respuesta realmente ayudó!
Fabio Milheiro
98

asegúrese de hacer su proyecto (con DbContext) como inicio

en el proyecto, haga clic derecho y seleccione

O

Agregue al proyecto que se establece como inicio su cadena de conexión en la app.config (o web.config)

O

Llama al comando así

Update-Database -Script -ProjectName '<project name>' -StartupProjectName '<project name>' -ConnectionString 'data source=.;initial catalog=<db name>;integrated security=True;MultipleActiveResultSets=True' -ConnectionProviderName 'System.Data.SqlClient'

Vuelva a intentarlo

CMS
fuente
2
En realidad, el proyecto contiene la cadena de conexión que debe establecerse como proyecto de inicio, y generalmente no es el proyecto en el que se encuentra su archivo DbContext
Raymond Wang
1
... por lo tanto, además de asegurarse de que Package Mgr se dirija a la capa correcta, esa misma capa debe ser Set as Startup Project, según la captura de pantalla que se muestra arriba. (aunque si presiona F5, no podrá iniciar la biblioteca de la clase)
bkwdesign
3
Esto me salvó la vida. Aunque en el Administrador de paquetes tenía el Proyecto predeterminado configurado para el proyecto donde se configuró el contexto, todavía no se anula.
garfbradaz
1
"¡Pero funcionó ayer! ¡ Exactamente el mismo comando !" => ESTO!
Simon_Weaver
1
La forma más fácil =)
Alexandr
29

Podrías simplemente pasar la cadena de conexión EntityFrameworky seguir con tu vida:

public partial class UtilityContext : DbContext
{
    static UtilityContext()
    {
        Database.SetInitializer<UtilityContext>(null);
    }

    public UtilityContext()
        : base("Data Source=SERVER;Initial Catalog=DATABASE;Persist Security Info=True;User ID=USERNAME;Password=PASSWORD;MultipleActiveResultSets=True")
    {
    }

    // DbSet, OnModelCreating, etc...
}
Serj Sagan
fuente
e hice mi día también porque no pude encontrar una solución a por qué mi proyecto de inicio de repente dejó de encontrar el archivo de configuración. Mi app.config y <appname> .exe.config aparecían en mi bin del proyecto de inicio y, sin embargo, EntityFramework no pudo encontrar la cadena de conexión que había estado usando desde siempre. Recientemente eliminé varios proyectos no utilizados de la solución y me pregunto si eso tuvo algo que ver con eso. Eliminé un proyecto web de la solución. Me preguntaba si mis otros proyectos dependían de web.config o algo inusual como eso.
GrayDwarf
La configuración del proyecto en ejecución es utilizada por todos los demás proyectos secundarios.
Serj Sagan
1
pero cómo configurar el nombre del proveedor?
FizxMike
9

Como supones, tiene que ver con que la cadena de conexión esté en app.config de la biblioteca de clases.

Copie la entrada de la clase app.config en el contenedor app.configo web.configarchivo

podiluska
fuente
8

Si tiene varios proyectos en solución, configure el proyecto tal como comenzó donde tiene su App.config de verdad.

W92
fuente
7

copie la cadena de conexión app.configo el web.configarchivo en el proyecto que se ha establecido en "Establecer como StartUpproyecto" y, en el caso de utilizar el marco de la entidad en el proyecto de capa de datos, instale el marco de la entidad nuget en el proyecto principal.

Ravi Anand
fuente
4

También ocurre si el proyecto de inicio se cambia al que no tiene las cadenas de conexión .

  1. Solución de clic derecho - haga clic en propiedades
  2. En Propiedades comunes, seleccione proyecto de inicio
  3. En el panel derecho, seleccione el proyecto que tiene las cadenas de conexión (en la mayoría de los casos, serán proyectos MVC, el proyecto que inicia la solución)
Ravi Ganesan
fuente
Si, funciona. He creado una biblioteca de clases para que EF se comunique con el DB y estaba teniendo el mismo problema.
Satinder Sidhu
4
  1. Agregar un archivo App.Config
  2. Establecer el proyecto como proyecto de inicio.
  3. Asegúrese de agregar las cadenas de conexión después de la entityFrameworksección:

    <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    
    </configSections>
    
    <connectionStrings>
       <!-- your connection string goes here, after configSection -->
    </connectionString>
A-Sharabiani
fuente
3

Si, es tonto. Puede evitar copiar la cadena de conexión utilizando un generador de conexiones. Código VB.Net (utilizado en producción, pero ligeramente modificado aquí, así que trátelo como no probado, feliz de ayudar con cualquier problema), donde tengo una variable serverName, una base de datos variable, los paso a un método y hago que genere la conexión para mi:

    Dim EfBuilder As New System.Data.EntityClient.EntityConnectionStringBuilder("metadata=res://*/VMware.VmEf.csdl|res://*/VMware.VmEf.ssdl|res://*/VMware.VmEf.msl;provider=System.Data.SqlClient;provider connection string=""data source=none;initial catalog=none;integrated security=True;multipleactiveresultsets=True;App=EntityFramework""")
   Dim SqlBuilder As New Data.SqlClient.SqlConnectionStringBuilder(EfBuilder.ProviderConnectionString)
                        SqlBuilder.DataSource = serverName
                        SqlBuilder.InitialCatalog = databaseName
                        EfBuilder.ProviderConnectionString = SqlBuilder.ConnectionString
                        Using vmCtx As New VmEfConn(EfBuilder.ConnectionString)
Gredoso
fuente
2

¿Está utilizando más de un proyecto en su solución?

Porque si es así, la configuración web que debe verificar es la del mismo proyecto que el archivo de .edmx

Diego
fuente
Si, este es el caso. El proyecto que contiene la cadena de conexión es una biblioteca de clases que incluye solo un archivo App.config. El proyecto MVC no parece estar comprobando esto aunque.
jjc99
durante el desarrollo solo revisará la aplicación.config en su proyecto, debe agregar allí
Diego
Gracias por tu respuesta. Intenté copiar la cadena de conexión del proyecto que contiene el archivo edmx y colocarlo en el archivo raíz web.config en mi proyecto MVC. Desafortunadamente, todavía no puede encontrar la cadena de conexión. ¿Tengo que modificar la cadena de conexión de alguna manera?
jjc99
es al revés. En tiempo de desarrollo, necesita la cadena de caracteres en app.cofnig en el proyecto que tiene el archivo .edmx. Si lo tienes, tal vez el nombre esté equivocado. El nombre de la cadena de conexiones debe ser el mismo nombre que la propiedad "nombre de contenedor de entidad" de su archivo .edmx
Diego
1

Agregue ConnectionString al archivo MVC Project Web.config

Mehmedov
fuente
1

He tenido este problema cuando uso varios proyectos, el proyecto de inicio con web.config y app.config para el proyecto EntityFramework.

para evitar este problema debes:

  1. Necesita la cadena de conexión en el archivo * .config iniciado.
  2. Necesita haber instalado la DLL de EntityFramework en sus referencias
ch2o
fuente
1

Me he enfrentado al mismo problema. Se me olvidó poner una cadena de conexión al proyecto de inicio ya que estoy realizando una operación de acceso a datos desde otra capa. Además, si no tiene app.config en su proyecto de inicio, agregue el archivo app.config y luego agregue una cadena de conexión a ese archivo de configuración.

Niraj Trivedi
fuente
1
Gracias, tuve un problema con la carga de mi proyecto y se perdió el "Proyecto de inicio". Su respuesta me recordó que debía asegurarme de que el proyecto con el archivo de contexto y app.config fuera el inicio.
Mastro
1

Obtuve esto al no tener el proyecto configurado como inicio, como lo indica otra respuesta. Mi contribución a esto: cuando haga Add-Migrations y Update-Database, especifique el proyecto de inicio como parte del comando en Nuget Package Manager Console (no incluya los caracteres '[' o ']', eso es solo para mostrarle que usted necesita cambiar el texto ubicado allí por el nombre de su proyecto):

  1. Habilitar migraciones
  2. Add-Migrations -StartupProject [el nombre de su proyecto que contiene la clase de contexto de datos]
  3. Update-Database -StartupProject [mismo nombre de proyecto que el anterior]

Deberias hacer eso.

JakeJ
fuente
De esta manera, puede incluir los comandos en sus procedimientos y no tener que cambiar constantemente el proyecto de inicio por encima del predeterminado.
JakeJ
1

Es porque su clase de contexto se hereda de DbContext. Supongo que tu ctor es así:

public MyEntities()
    : base("name=MyEntities")

name=... debe cambiarse por el nombre de su conexión

Tipo de def
fuente
0

La cadena de conexión generada por el proyecto que contiene el archivo .edmx genera la cadena de conexión, esto parece ser un remanente de los tipos de archivos app.config que se copiaron en el directorio de salida y al que el ejecutable hace referencia para almacenar la información de configuración del tiempo de ejecución.

Esto interrumpe el proyecto web ya que no hay un proceso automático para agregar información aleatoria .config al archivo web.config para el proyecto web.

Lo más fácil es copiar la cadena de conexión del archivo de configuración a la sección de conexiones del archivo web.config y no tener en cuenta el contenido del archivo de configuración.

Mike Beeler
fuente
0

La mejor manera que acabo de encontrar para abordar esto es establecer temporalmente ese proyecto (muy probablemente una biblioteca de clases) en el proyecto de inicio. Esto obliga a la consola del administrador de paquetes a usar ese proyecto como fuente de configuración. Parte de la razón por la que se configura de esta manera se debe al modelo de arriba hacia abajo que suelen seguir los archivos económicos. La regla general es que el proyecto más cercano al cliente (aplicación MVC, por ejemplo) es el web.config o app.config que se utilizará.

gcoleman0828
fuente
0

Asegúrese de haber colocado la cadena de conexión en ROOT web.config del proyecto de inicio.

Sé que estoy afirmando algo obvio aquí, pero también me pasó a mí, aunque ya TENÍA la cadena de conexión en la Web de mi proyecto MVC.Config (el archivo .edmx se colocó en un proyecto de biblioteca de clase diferente) y no pude no entiendo por qué sigo recibiendo una excepción ... Para resumir, copié la cadena de conexión a Views \ Web.Config por error, en una extraña combinación de cansancio y no desplazarse al final de la página. -el-escenario-explorador de soluciones. Sí, estas cosas también les pasan a los desarrolladores veteranos :)

ShayLivyatan
fuente
0

Este problema ocurre cuando usa Capas en su Proyecto y define o instala el marco de Entidad en DataLayer e intenta ejecutar su Proyecto

Entonces, para superar este problema, copie la cadena de conexión de la capa donde está el archivo Edmx y pegue la cadena de conexión en web.config principal.

Debendra Dash
fuente
0

Agregue una cadena de conexión en el archivo web.config raíz del proyecto MVC 'contenedor' que hace referencia a la biblioteca de clases de la siguiente manera:

 <connectionStrings>

  <add name="MyEntities" connectionString="complete connection string here" providerName="System.Data.SqlClient" />

  </connectionStrings>

Si no desea utilizar "MyEntities" como nombre de conexión, cámbielo como desee pero realice el siguiente cambio en su clase MyEntities DbContext:

MyEntities: DbContext
 {
   public MyEntities():base("Name-Of-connection-string-you wish to connect"){ }
 }

La razón de este error es, si no especificaremos el nombre de la cadena de conexión o la cadena de conexión en la clase derivada de DbConext (en su caso es MyEntities), entonces DbContext buscará automáticamente una cadena de conexión en el archivo web.config raíz cuyo nombre es igual que el nombre de la clase derivada (en su caso, es Mis entidades).

Pawan Rai
fuente
0

Tuve este problema al ejecutar MSTest. No podría hacerlo funcionar sin la bandera de "noisolation".

Esperemos que esto ayude a alguien. Me costó mucho tiempo resolver eso. Todo salió bien desde el IDE. Algo extraño sobre el Entity Framework en este contexto.

Brian Wirt
fuente
0

Migraciones regulares

Hay dos opciones: la primera que todos aquí han sugerido es asegurarse de que la cadena de conexión esté en el archivo Web.config del proyecto. Al trabajar con cadenas de conexión desde la configuración de la aplicación de Azure, eso significa sobrescribir sus valores de Web.config con los valores de Azure.

Azure o migraciones automáticas (programáticas)

Hay una segunda opción disponible si está ejecutando migraciones mediante programación, que le permite ejecutar migraciones utilizando una cadena de conexión que se obtiene dinámicamente (o mediante la configuración de la aplicación de Azure) sin almacenarla en Web.config:

Al establecer la base de datos TargetData de la configuración , use el constructor DbConnectionInfo que toma una cadena de conexión y un nombre de proveedor en lugar del constructor que toma solo un nombre de conexión. Si su cadena de conexión no tiene un nombre de proveedor y está usando SQL Server / Azure SQL, use "System.Data.SqlClient"

lo correcto
fuente
0

Esto también podría dar como resultado que no se hagan suficientes referencias de dll en el código de llamada. Un pequeño truco torpe podría salvarte el día.

Estaba siguiendo el enfoque de DB First y había creado el archivo EDMX en el proyecto de la biblioteca DAL Class, y esto estaba haciendo referencia a la biblioteca BAL Class, que a su vez fue referenciada por un servicio WCF.

Como recibí este error en el BAL, probé el método mencionado anteriormente para copiar los detalles de configuración de la configuración de la aplicación del proyecto DAL, pero no lo resolví. En última instancia, con la punta de un amigo, acabo de agregar un archivo EDMX ficticio al proyecto WCF (con la conectividad de base de datos relevante, etc.), por lo que importó todo lo necesario, y luego eliminé el archivo EDMX, y me deshice del problema con Una construcción limpia.

sm2mafaz
fuente
0

Hay un comentario en la respuesta superior de @RyanMann que sugiere:

Almacene sus cadenas de conexión en un archivo de configuración, luego haga referencia a ellas en otros proyectos por <connectionString configSource="../ProjectDir/SharedConnections.config" />

Esta es una sugerencia fantástica!

¡También funciona para compartir cadenas de conexión entre los archivos App.config y Web.config!

Cualquier persona que quiera seguir esta sugerencia, debe dirigirse a esta respuesta SO . Tiene una guía paso a paso realmente genial para compartir cadenas de conexión entre múltiples proyectos en una solución.

La única advertencia es que configSourcedebe existir en el mismo directorio o en un subdirectorio. El enlace anterior explica cómo usar "Agregar como enlace" para solucionar esto.

br3nt
fuente
0

Tuve este error al intentar usar EF dentro de un complemento de AutoCAD. Los complementos CAD obtienen la cadena de conexión del archivo acad.exe.config. Agregue la cadena de conexión como se mencionó anteriormente al archivo de configuración de acad y funciona.

El crédito va a Norman.Yuan de ADN.Network.

midohioboarder
fuente
0

Si está utilizando un modelo MVVM, intente copiar las cadenas de conexión a todas las partes de su proyecto.

Por ejemplo, si su solución contiene dos proyectos, el proyecto de biblioteca de clases y el proyecto wpf, debe copiar las cadenas de conexión del proyecto de fondo (proyecto de clase de biblioteca) y colocar una copia en el archivo App.config del proyecto wpf.

<connectionStrings>
  <add name="DBEntities" ... />
</connectionStrings>

Espero que sea útil para ti :)

Adem El Awity
fuente
-2

Agregue Connectoinstrnig en el archivo web.config

<ConnectionStiring> <add name="dbName" Connectionstring=" include provider name too"  ></ConnectionStiring>
saun4frsh
fuente