Nenhuma cadeia de conexão denominada 'MyEntities' foi encontrada no arquivo de configuração do aplicativo

246

Estou usando a estrutura de entidade e o ASP.NET MVC 4 para criar um aplicativo

Minha solução é dividida em dois projetos;

  • Uma biblioteca de classes que inclui meu arquivo de modelo de dados (.edmx) e algumas interfaces personalizadas
  • O projeto MVC 'container' que referencia a biblioteca de classes acima

Meu problema é que quando eu tentar usar o 'MyEntites' DbContext eu recebo o seguinte erro:

Não foi encontrada nenhuma cadeia de conexão chamada 'MyEntities' no arquivo de configuração do aplicativo.

Eu acho que o problema tem algo a ver com o fato de que a cadeia de conexão está dentro do app.config da biblioteca de classes e não no projeto MVC.

Alguém tem alguma sugestão?

jjc99
fonte
15
Não é exatamente o mesmo contexto que o seu (migrações automáticas com o EF6), mas tive o mesmo problema com uma mensagem de erro semelhante quando criei um ramo filho no TFS e comecei a trabalhar nele. A marcação do projeto mvc como projeto de inicialização resolveu isso. output 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).
Mechanical Object

Respostas:

309

Tente copiar a sequência de conexões para o arquivo .config no projeto MVC.

Jerry
fonte
63
Funciona perfeitamente, mas gostaria de saber por que o projeto referenciado não está usando seu próprio arquivo de configuração para buscar a cadeia de conexão.
Null Head
7
@ Alexander antiga pergunta, mas sim, eu também gostaria de saber o porquê.
Kehlan Krumme
22
@Alexander, a estrutura carrega e usa o (s) arquivo (s) de configuração para o assembly em execução. Nesse caso, é o projeto da web. As bibliotecas de classes geralmente não têm seus próprios arquivos de configuração.
kiprainey
24
Os comandos Enable-Migration, quando executados no contexto do NuGet COnsole, examinam o arquivo de configuração dos Projetos de Inicialização, não necessariamente o projeto em que você pensaria. Basta definir o projeto com o app.config que você deseja que seja a inicialização projeto. Opcionalmente, Armazene seus seqüências de conexão em um arquivo de configuração, em seguida, referenciá-los em outros projetos por <connectionString configSource = "../ ProjectDir / SharedConnections.config" />
Ryan Mann
3
Recebi essa mensagem de erro exata, mas meu arquivo .config - no projeto certo - realmente listou a seqüência de conexão correta. No entanto, eu estava usando transformações, e a cadeia de conexão obviamente não foi mencionada no arquivo .config transformado. Portanto, isso é algo a ser observado, se você estiver usando transformações de arquivo de configuração.
Morten Nørgaard
143

Você está certo, isso acontece porque a biblioteca de classes (onde o arquivo .edmx) não é seu projeto inicial / principal.

Você precisará copiar a cadeia de conexão no arquivo de configuração do projeto principal.

Caso seu projeto de inicialização / principal não tenha um arquivo de configuração (como no meu caso de aplicativo de console), basta adicionar um (projeto de inicialização - Adicionar novo item -> arquivo de configuração do aplicativo).

Informações mais relevantes podem ser encontradas aqui: MetadataException: Não foi possível carregar o recurso de metadados especificado

Oren
fonte
8
A principal resposta para isso é que a biblioteca de classes (onde está o arquivo .edmx) não é seu projeto STARTUP. Percebi que meu projeto de inicialização não estava definido para o projeto que continha meu web.config. Era um aplicativo de console com um app.config diferente. Portanto, se você estiver adicionando aplicativos de console à sua solução da Web, verifique se o seu projeto da Web é o projeto de inicialização ao executar o update-database!
11113 Karl
1
Descarreguei meu projeto principal por algum motivo e, após recarregá-lo, recebi esse erro ao tentar adicionar migrações. Fazer o projeto de inicialização do projeto principal novamente resolveu o problema. Obrigado @Oren
Azadrum
2
Meu projeto de inicialização foi alterado por engano. Essa é a parte chave. Sua resposta realmente ajudou!
Fabio Milheiro
98

certifique-se de fazer seu projeto (com o DbContext) como inicialização

no projeto, clique com o botão direito e selecione

OU

Adicione ao projeto definido como inicialização sua cadeia de conexão no app.config (ou web.config)

OU

Chame o comando como este

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'

Então tente novamente

CMS
fonte
2
É realmente o projeto contém a seqüência de conexão deve ser definido como projeto de inicialização, e, geralmente, não é o projeto que seu arquivo DbContext senta
Raymond Wang
1
... assim, além de garantir que o Package Mgr tenha como alvo a camada correta, essa mesma camada precisa ser Set as Startup Project- conforme a captura de tela mostrada acima. (embora se você bater F5, você não seria capaz de iniciar a biblioteca de classes)
bkwdesign
3
Isso salvou minha vida. Embora no Gerenciador de Pacotes eu tenha o Projeto Padrão definido no projeto em que o contexto foi definido, ele ainda não foi substituído.
fácil
1
"Mas funcionou ontem! Exatamente o mesmo comando !" => ISTO!
Simon_Weaver
1
A maneira mais fácil =)
Alexandr
29

Você pode simplesmente passar a cadeia de conexão EntityFrameworke seguir com sua 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
fonte
e fiz o meu dia também porque não consegui encontrar uma solução para o motivo pelo qual meu projeto de inicialização parou de repente de encontrar o arquivo de configuração. Meu app.config e <appname> .exe.config estavam aparecendo na lixeira do projeto de inicialização e, no entanto, o EntityFramework não conseguiu encontrar a cadeia de conexão que eu estava usando desde sempre. Eu removi recentemente vários projetos não utilizados da solução e estou me perguntando se isso tinha alguma coisa a ver com isso. Eu removi um projeto da Web da solução. Pensando se meus outros projetos estavam contando com o web.config ou algo incomum assim.
10897 GrayDwarf
A configuração do projeto em execução é usada por todos os outros projetos filhos.
Serj Sagan
1
mas como definir o nome do provedor?
FizxMike
9

Como você supõe, isso tem a ver com a cadeia de conexão estar no app.config da biblioteca de classes.

Copie a entrada da classe app.config para o contêiner app.configou web.configarquivo

podiluska
fonte
8

Se você tiver vários projetos em solução, configure o projeto como iniciado, onde você tem seu App.config verdade.

W92
fonte
7

copie a seqüência de conexão app.configou web.configarquivo no projeto definido como "Definir como StartUpprojeto" e, no caso de usar a estrutura de entidades no projeto da camada de dados - instale o nuget da estrutura de entidades no projeto principal.

Ravi Anand
fonte
4

Isso também acontece se o projeto de inicialização for alterado para o que não possui as cadeias de conexão .

  1. Solução com o botão direito - clique nas propriedades
  2. Em Propriedades comuns, selecione projeto de inicialização
  3. No painel direito, selecione o projeto que possui as cadeias de conexão (na maioria dos casos, serão projetos MVC - o projeto que inicia a solução)
Ravi Ganesan
fonte
Sim, funciona. Eu criei uma biblioteca de classes para a EF se comunicar com o banco de dados e estava recebendo o mesmo problema.
Satinder Sidhu
4
  1. Adicionar um arquivo App.Config
  2. Defina o projeto como projeto de inicialização.
  3. Certifique-se de adicionar as cadeias de conexão após a entityFrameworkseção:

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

Sim, é bobagem. Você pode evitar copiar a cadeia de conexão usando um construtor de conexões. Código VB.Net (usado na produção, mas ligeiramente modificado aqui, portanto, trato como não testado, prazer em ajudar com qualquer problema), onde eu tenho uma variável serverName, uma variável databaseName, eu as passo em um método e gero a conexão para mim:

    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)
Chalky
fonte
2

você está usando mais de um projeto em sua solução?

Porque se você estiver, a configuração da web que você deve verificar é a do mesmo projeto que o arquivo de .edmx

Diego
fonte
Sim, é esse o caso. O projeto que contém a cadeia de conexão é uma biblioteca de classes que inclui apenas um arquivo App.config. O projeto MVC não parece estar checando isso.
Jjc99 27/09/12
durante o desenvolvimento, apenas chechará o app.config em seu projeto, você deve adicioná
Diego Diego
Obrigado pela sua resposta. Tentei copiar a cadeia de conexão do projeto que contém o arquivo edmx e colocá-lo no arquivo raiz web.config no meu projeto MVC. Infelizmente, ainda não foi possível encontrar a cadeia de conexão. Preciso modificar a cadeia de conexão de alguma forma?
Jjc99
É o contrário. No tempo de desenvolvimento, você precisa da sequência de caracteres no app.cofnig no projeto que possui o arquivo .edmx. Se você o tiver, talvez o nome esteja errado. O nome da seqüência de conexões deve ser o mesmo nome que a "entidade nome containr" propriedade do seu arquivo edmx
Diego
1

Adicionar ConnectionString ao arquivo MVC Project Web.config

Mehmedov
fonte
1

Eu tive esse problema ao usar vários projetos, o projeto inicial com web.config e app.config para o projeto EntityFramework.

para evitar esse problema, você deve:

  1. Você precisa da cadeia de conexão no arquivo * .config iniciado.
  2. Você precisa ter instalado a DLL do EntityFramework em suas referências
ch2o
fonte
1

Eu enfrentei o mesmo problema. Não foi possível colocar a cadeia de conexão no projeto de inicialização, pois estou executando a operação de acesso a dados de outra camada. Além disso, se você não tiver o app.config no seu projeto de inicialização, adicione o arquivo app.config e, em seguida, adicione uma cadeia de conexão ao arquivo de configuração.

Niraj Trivedi
fonte
1
Obrigado, tive um problema com o carregamento do meu projeto e ele perdeu o "Projeto de Inicialização". Sua resposta me lembrou de garantir que o projeto com o arquivo de contexto e app.config fosse a inicialização.
Mastro
1

Consegui isso por não ter o projeto definido como inicialização, conforme indicado por outra resposta. Minha contribuição para isso - ao fazer Add-Migrations e Update-Database, especifique o projeto de inicialização como parte do comando no Nuget Package Manager Console (não inclua os caracteres '[' ou ']' ', apenas para mostrar que você precisa alterar o texto localizado lá para o nome do seu projeto):

  1. Ativar migrações
  2. Add-Migrations -StartupProject [o nome do seu projeto que contém a classe de contexto dos dados]
  3. Update-Database -StartupProject [mesmo nome do projeto acima]

Isso deve resolver.

JakeJ
fonte
Dessa forma, você pode incluir os comandos em seus procedimentos e não precisa alterar constantemente o projeto de inicialização do padrão.
JakeJ
1

Isso ocorre porque sua classe de contexto está sendo herdada do DbContext. Eu acho que o seu ctor é assim:

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

name=... deve ser alterado para o nome da sua connectionString

Tipo de definição
fonte
0

A cadeia de conexão gerada pelo projeto que contém o arquivo .edmx gera a cadeia de conexão, isso parece ser uma retenção dos tipos de arquivos app.config que foram copiados para o diretório de saída e referenciados pelo executável para armazenar informações de configuração de tempo de execução.

Isso é interrompido no projeto da web, pois não há processo automático para adicionar informações aleatórias .config ao arquivo web.config do projeto.

O mais fácil é copiar a cadeia de conexão do arquivo de configuração para a seção de conexões do arquivo web.config e desconsiderar o conteúdo do arquivo de configuração.

Mike Beeler
fonte
0

A melhor maneira que acabei de encontrar para resolver isso é definir temporariamente esse projeto (provavelmente uma biblioteca de classes) para o projeto de inicialização. Isso força o console do gerenciador de pacotes a usar esse projeto como fonte de configuração. parte da razão pela qual é configurada dessa maneira é por causa do modelo descendente que os arquivos econfig geralmente seguem. A regra geral é que o projeto mais próximo do cliente (aplicativo MVC, por exemplo) é o web.config ou app.config que será usado.

gcoleman0828
fonte
0

Verifique se você inseriu a string de conexão no ROOT web.config do projeto de inicialização.

Eu sei que estou dizendo o óbvio aqui, mas aconteceu comigo também - embora eu já tivesse a string de conexão no Web.Config do meu projeto MVC (o arquivo .edmx foi colocado em um projeto diferente da biblioteca de classes) e não consegui descubra por que continuo recebendo uma exceção ... Para encurtar a história, copiei a cadeia de conexão para o Views \ Web.Config por engano, em uma estranha combinação de cansaço e não rolar para o fundo da tela. O cenário do explorador de soluções. Sim, essas coisas também acontecem com desenvolvedores veteranos :)

ShayLivyatan
fonte
0

Esse problema ocorre quando você está usando Camadas em seu Projeto e define ou instala o trabalho de quadro de Entidade no DataLayer e tenta executar seu Projeto

Portanto, para superar esse problema, copie a string de conexão da camada em que o arquivo Edmx está lá e cole a string de conexão no web.config principal.

Debendra Dash
fonte
0

Adicione uma cadeia de conexão no arquivo raiz web.config do projeto MVC 'container' que referencia a biblioteca de classes da seguinte maneira:

 <connectionStrings>

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

  </connectionStrings>

Se você não quiser usar "MyEntities" como nome da conexão, altere-o como desejar, mas faça a seguinte alteração na classe MyEntities DbContext:

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

O motivo desse erro é: Se não especificarmos o nome da cadeia de conexão ou conectar a cadeia na classe derivada de DbConext (no seu caso, é MyEntities), o DbContext procurará automaticamente uma cadeia de conexão no arquivo raiz web.config, cujo nome é igual ao nome da classe derivada (no seu caso, são Minhas Entidades).

Pawan Rai
fonte
0

Eu tive esse problema ao executar o MSTest. Não consegui fazê-lo funcionar sem a bandeira "noisolation".

Espero que isso ajude alguém. Me custou muito tempo para descobrir isso. Tudo correu bem a partir do IDE. Algo estranho sobre o Entity Framework neste contexto.

Brian Wirt
fonte
0

Migrações regulares

Existem duas opções - a primeira que todos sugeriram é garantir que a cadeia de conexão esteja no arquivo Web.config do projeto. Ao trabalhar com cadeias de conexão nas configurações de aplicativos do Azure, isso significa substituir os valores Web.config pelos valores do Azure.

Migrações do Azure ou automáticas (programática)

Existe uma segunda opção disponível se você estiver executando migrações programaticamente, que permite executar migrações usando uma cadeia de conexão obtida dinamicamente (ou através das configurações de aplicativos do Azure) sem armazená-la no Web.config:

Ao definir o TargetDatabase da configuração , use o construtor DbConnectionInfo que usa uma cadeia de conexão e um nome de provedor em vez do construtor que usa apenas um nome de conexão. Se a cadeia de conexão não tiver um nome de provedor e você estiver usando o SQL Server / Azure SQL, use "System.Data.SqlClient"

a coisa certa
fonte
0

Isso também pode resultar em referências de DLL insuficientes sendo referenciadas no código de chamada. Um pequeno truque desajeitado pode salvar seu dia.

Eu estava seguindo a abordagem do DB First e havia criado o arquivo EDMX no projeto da biblioteca da classe DAL, e isso referia-se à biblioteca da classe BAL, que por sua vez foi referenciada por um serviço WCF.

Desde que eu estava recebendo esse erro no BAL, tentei o método mencionado acima para copiar os detalhes de configuração do App.config do projeto DAL, mas não resolvi. Por fim, com a dica de um amigo, acabei de adicionar um arquivo EDMX fictício ao projeto WCF (com DB Connectivity relevante etc.), para que ele importasse tudo o necessário e, em seguida, apenas apaguei o arquivo EDMX, e ele se livrou do problema com uma construção limpa.

sm2mafaz
fonte
0

Há um comentário na resposta principal de @RyanMann que sugere:

Armazene suas seqüências de conexão em um arquivo de configuração e faça referência a elas em outros projetos, <connectionString configSource="../ProjectDir/SharedConnections.config" />

Esta é uma sugestão fantástica!

Também funciona para compartilhar cadeias de conexão entre os arquivos App.config e Web.config!

Qualquer pessoa que queira seguir esta sugestão, deve seguir para esta resposta do SO . Ele tem um ótimo guia passo a passo sobre o compartilhamento de cadeias de conexão entre vários projetos em uma solução.

A única ressalva é que configSourcedeve existir no mesmo diretório ou subdiretório. O link acima explica como usar "Adicionar como link" para contornar isso.

br3nt
fonte
0

Eu tive esse erro ao tentar usar o EF dentro de um plugin do AutoCAD. Os plug-ins de CAD obtêm a cadeia de conexão do arquivo acad.exe.config. Adicione a string de conexão conforme mencionado acima ao arquivo de configuração do acad e ele funcionará.

O crédito vai para Norman.Yuan da ADN.Network.

midohioboarder
fonte
0

Se você estiver usando um modelo MVVM, tente copiar as seqüências de conexão para todas as partes do seu projeto.

Por exemplo, se sua solução contiver dois projetos, o projeto da biblioteca de classes e o projeto wpf, copie as seqüências de conexão do projeto de back-end (porject da classe de biblioteca) e coloque uma cópia no arquivo App.config do projeto wpf.

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

Espero que seja útil para você :)

Adem El Awity
fonte
-2

Adicionar Connectoinstrnig no arquivo web.config

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