A conexão nomeada especificada não é encontrada na configuração, não deve ser usada com o provedor EntityClient ou é inválida

170

Eu tenho um objeto de estrutura de uma entidade e quando o adiciono ao meu projeto, ele connectionstring é adicionado app.configna connectionstringseção, mas quando eu quero criar um novo entitycontexte usar isso connectionstring, esse erro aparece

user421413
fonte
4
Obrigado pelo link, Craig. Eu voto para manter esse segmento, no entanto, porque o título foi o que me ajudou a encontrar o erro MetadataException.
Jp2code
Isso aconteceu comigo quando o arquivo de configuração não foi atualizado com uma cadeia de conexão por algum motivo estranho.
usar o seguinte código

Respostas:

217

Suspeito que o seu problema esteja relacionado ao fato de você ter mais de um projeto em sua solução e o que contém o material da estrutura da entidade, incluindo edmxarquivos, NÃO é o projeto de inicialização das soluções. Nesse caso, mesmo que a cadeia de conexão exista no app.configprojeto EF , o CLR ainda não poderá encontrá-la em tempo de execução. Por exemplo, se você possui um site e um projeto EF em sua solução, precisa copiar a cadeia de conexão dos projetos EF app.configpara os do seu site web.config. Basicamente, qualquer dado de cadeia de conexão deve existir no arquivo de configuração do projeto do qual os threads .Net foram iniciados pelo CLR (ou seja, seu projeto de inicialização). Se não for esse o seu caso, basta abrir o seuedmx, clique com o botão direito do mouse na superfície, selecione propriedades e copie a cadeia de conexão e cole-a na app.configseção Cadeia de Conexão. Dessa forma, você pode ter certeza de que está tendo o correto na sua configuração.

EDIT:
Como você pode ver aqui na Documentação no ObjectContext Constructor , o primeiro parâmetro é o nome da string de conexão, que é o código gerado no momento em que você cria seu EDM. Se, de alguma forma, o nome do seu nome da cadeia de conexão for alterado, tudo o que você precisa fazer é clicar com o botão direito do mouse no seu modelo e selecionar "Atualizar modelo do banco de dados ..." e seguir o assistente para atualizar sua confing e designer para refletir isso mudança.

Morteza Manavi
fonte
1
oi Morteza e obrigado pela sua resposta, mas eu anteriormente copiei a conexão sectin em web.config, mas o erro não foi resolvido, mas quando em entitymodel.designer substitui (public EntityContext (): base ("name = EntityContext", EntityContext " )) com a conexão que funcionou, qualquer idae
user421413
1
@Morteza, você tem uma solução para projetos nos quais o assembly em execução não possui um app.config? No meu caso, o executável de chamada é um aplicativo VB6 que chama meu assembly (onde estão os objetos de entidade) por meio da interoperabilidade COM.
Dave perecível
4
tão simples, mas tão frustrante. Up VOTE. Viva o stackoverflow!
usar o seguinte código
3
Se você estiver usando o WCF, lembre-se de incluir a cadeia de conexão no seu projeto de serviço
Nathan
1
Obrigado Morteza, me poupou muito tempo!
23413 Chris
32

Você precisa copiar a cadeia de conexão no app.config para o seu web.config ou copiar o arquivo inteiro no projeto que exibe a saída. É uma das condições para consumir a estrutura.

Musikero31
fonte
1
basta adicionar a mesma cadeia de conexão (como no projeto de acesso a dados) no seu web.config (encontrado no projeto de front-end).
dinamarquês
@ Musikero31 Eu uso EF e defino todas as seqüências de conexão de entidade no código. Eu não tenho nada em uma configuração relacionada a ele.
perfil completo de Keith Beard
Depois de copiar os arquivos DAL para um novo projeto, também recebi o erro acima. Olhando mais de perto os arquivos de configuração, notei que a cadeia de conexão foi substituída pelo EF. Consegui copiar / colar manualmente a seqüência de conexão correta no novo projeto e funcionou.
Ravi Ram
9

Eu me deparei com esse problema quando tentei colocar minha lógica de banco de dados personalizada em uma DLL para ser usada por vários projetos em minha solução.

Embora o arquivo .dll tenha o arquivo app.config correto, ele não funcionou. As estruturas de entidade desejavam as informações de conexão no app.config do .exe. Copiar as informações para lá funcionou muito bem.

A solução de Morteza de colar a cadeia de conexão diretamente no .edmx não funcionou para mim, pois não me permitiu colar o valor lá - embora seja exatamente isso que eu queria poder fazer.

Walt Stoneburner
fonte
3
Mesmo que houvesse apenas um app.config (e esse era o único arquivo de configuração nesse diretório) no diretório do meu exe, ele não o leria. Eu tive que renomear o arquivo myExe.exe.config
Mario
6

Oi, eu tive esse problema e estava me deixando louco. Enfim, finalmente eu descobri qual era o problema. Primeira coisa que você tem a fazer é se certificar de que o connectionstringsno app.confige web.configsão os mesmos. Então você deve clicar duas vezes no .edmxarquivo para poder ver as tabelas. Quando você clicar em qualquer lugar perto das tabelas, mas não nas tabelas, vá para Propriedades. Na lista suspensa, selecione ConceptualEntityModele pesquise o Nome do contêiner da entidade e lembre-se bem dele.

Em seguida, vá para o designer do arquivo edmx e abra os construtores. (o designer é a subpasta do arquivo edmx) os construtores devem ter dois parâmetros no parâmetro BASE

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

Este é um deles. o primeiro parâmetro deve ter o nome do arquivo do projeto em que o .edmxarquivo está. O segundo parâmetro deve ter o nome do nome do contêiner da entidade das propriedades que mencionei anteriormente. não esqueça de organizar todos os construtores com o:base("", "")

Pelo menos esse era o meu problema e meu problema foi resolvido assim. Espero que você consiga resolver o seu assim.

MaltaCoders
fonte
6

Eu tinha uma variação disso que ninguém parecia cobrir.

Eu tinha um projeto principal com alguns modelos e um projeto de teste contendo testes de unidade. O Projeto de Teste estava funcionando, mas parou com o erro mencionado no OP. Eu não havia renomeado ou movido o arquivo EDMX.

Muitos conselhos foram mencionados na comparação de arquivos .config, mas meu projeto não possuía nenhum.

No final, copiei o arquivo app.config do projeto principal para o meu projeto de teste e funcionou. Se esta é a etapa correta ou apresentará problemas de manutenção quando modelos adicionais forem adicionados, eu não sei, mas pelo menos meus testes de unidade estão sendo executados corretamente novamente agora.

S. Baggy
fonte
Desde que publiquei isso, percebi que provavelmente seria melhor criar um link para o arquivo app.config de outro projeto. Mas, ainda assim, a outra abordagem funcionará para corrigir o problema original quando não houver nenhum arquivo de configuração.
S. Baggy
4

Embora a resposta de Morteza Manavi ' resolva esse problema, outra solução é criar a cadeia de conexão dinamicamente e passá-la ao construtor do seu 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());

Isso elimina a necessidade de copiar as informações da cadeia de conexão no app.config do seu projeto de inicialização que, pelo menos no meu caso, não era desejável.

Nick Spreitzer
fonte
4

Esqueci de adicionar providerName = "System.Data.EntityClient" como atributo na cadeia de conexão. Isso resultou nesse erro, então

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

ao invés de

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

Acabei de descobrir que, se um aplicativo for criado no IIS a partir do VS2010, dois níveis da raiz do site, esse erro ocorrerá. Não sei por que isso acontece, precisaria investigar mais. Por exemplo, se seu aplicativo estiver neste caminho: /admin/advertisero erro aparecerá se você não tiver /adminum diretório virtual no site do IIS.

Tudo o que fiz foi criar um admindiretório vazio no meu .../intepub/wwwrooterro desapareceu.

Você descobrirá que não poderá iniciar a depuração até executar a etapa acima.

Tínhamos esse problema em nossa equipe no passado, demorou algum tempo para lembrar, mas foi exatamente assim que o corrigimos antes.

Jovica Zaric
fonte
1

Estou usando a arquitetura n'tier e tenho o mesmo problema, mas este me ajuda. Espero que isso ajude você. Primeiro você tem mesmo connection stringde você librariesonde você pode acessar DB como em app.confige web.config depois que você simplesmente adicionar um arquivo sobrecarregado construtor na edmx (Model.context.cs) que agora você tem dois, um construtor é padrão e o outro u apenas acrescentado ( sobrecarregado).

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

Eu tinha uma biblioteca de classes que também não queria trabalhar com a EF. Depois de copiar o app.config (ou apenas a seção connectionstring) da minha biblioteca de classes para o projeto exe, a conexão funcionou bem! Provavelmente, espera-se que o arquivo de configuração esteja na mesma pasta que o projeto exe e, portanto, não foi encontrado. Portanto, sempre tenha muito cuidado ao usar um arquivo de configuração em um projeto de biblioteca de classes!

Vincent
fonte
0

Bem ... esse problema também pode ser por uma razão muito simples (burra) ... Copiei um arquivo de outro projeto e esqueci de alterar o ConnectionString no EntityDataSource ... como estava no início do projeto e aconteceu na página de login, pensei que era algo na configuração, mas era apenas o nome da string de conexão errada (e DefaultContainerName).

Gabriel G
fonte