MetadataException: Não foi possível carregar o recurso de metadados especificado

681

De repente, eu continuo MetadataExceptioninstanciando minha ObjectContextclasse gerada . A cadeia de conexão no App.Config parece correta - não mudou desde a última vez que funcionou - e tentei regenerar um novo modelo (arquivo edmx) do banco de dados subjacente sem alterações.

Alguém tem alguma ideia?

Mais detalhes: não alterei nenhuma propriedade, não alterei o nome de nenhum assembly de saída, não tentei incorporar o EDMX no assembly. Eu apenas esperei 10 horas saindo do trabalho até voltar. E então não estava mais funcionando.

Eu tentei recriar o EDMX. Eu tentei recriar o projeto. Eu até tentei recriar o banco de dados, do zero. Sem sorte, qualquer que seja.

J. Steen
fonte
14
Se houver uma pergunta SO sobre um produto específico com mais de 200 mil visualizações, o produto não funcionará da maneira que os usuários esperam. Eu gostaria de ver a Microsoft resolver isso. Aqui está um link para sugestões, se você tiver tempo: visualstudio.uservoice.com/forums/121579-visual-studio .
Tony L.
Meu problema foi resolvido, substituindo a cadeia de conexão copiada do projeto da camada db.
Hardik

Respostas:

856

Isso significa que o aplicativo não pode carregar o EDMX. Existem várias coisas que podem causar isso.

  • Você pode ter alterado a propriedade MetadataArtifactProcessing do modelo para Copy to Output Directory.
  • A cadeia de conexão pode estar errada. Sei que você diz que não mudou, mas se você mudou outras coisas (por exemplo, o nome de uma montagem), ainda pode estar errado.
  • Você pode estar usando uma tarefa pós-compilação para incorporar o EDMX no assembly, que não está mais funcionando por algum motivo.

Em resumo, não há detalhes suficientes na sua pergunta para fornecer uma resposta precisa, mas espero que essas idéias o levem ao caminho certo.

Atualização: escrevi uma postagem no blog com etapas mais completas para solução de problemas .

Craig Stuntz
fonte
70
A cadeia de conexão, apesar dos meus esforços para compará-lo com um utilitário de comparação de conteúdo da última vez, estava errada.
297 J. Steen
16
Foi a conexão para mim também. Quando você tem testes de integração que também precisam de conexão em seu próprio App.config, as coisas podem ficar fora de sincronia quando você atualiza seu edmx.
Ray
11
OK, corrigi-o simplesmente configurando "Incorporar"; compilando e redefinindo-o para o outro. Isso resolveu meu problema.
Shimmy Weitzhandler
6
Tive o mesmo problema, tentei sua solução, queria dar +1, percebi que já fiz isso no passado. Eu nem me lembro de ter esse problema antes;). Desta vez, no meu caso, foi a seqüência de conexão correta na Class Library com edmx e incorreta no aplicativo da web quando foi usada.
Episodex 23/10/12
9
Guia incrível. Para mim, copiei outra cadeia de conexão que usava res: // * / Database.MyModel2 ..., quando REALMENTE queria res: // * / MyModel1 ... (Banco de dados é uma pasta dentro do meu projeto de testes de integração)
Emragins 25/05
360

Essa pequena mudança ajuda com esse problema.

Tenho solução com 3 projetos.

connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;

mudar para

connectionString="metadata=res://*/;
MicTech
fonte
11
Foi consertado para mim, mas o que diabos isso significa?
Lance Fisher
18
@Lance: Eu explico isso em detalhes nesta postagem
Craig Stuntz 13/08/10
4
@jocull: Não, não funcionará em muitos casos e será lento em outros. Leia minha postagem no blog para entender o porquê.
Craig Stuntz
6
Movi meu arquivo .edmx para a pasta Modelo e esqueci de atualizar a cadeia de conexão. Ótimo ponteiro. Obrigado. Teria me levado horas para descobrir.
muruge
11
O senhor salvou um funcionário pobre da Microsoft de um consumidor muito irritado.
O homem de muffin
115

Você pode obter essa exceção quando o Edmx está em um projeto e o está usando em outro.

O motivo é Res://*/um uri que aponta para recursos na montagem ATUAL. Se o Edm estiver definido em um assembly diferente do código que está sendo usado, res: // * / não funcionará porque o recurso não pode ser encontrado.

Em vez de especificar '*', é necessário fornecer o nome completo do assembly (incluindo o token de chave pública). Por exemplo:

res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...

Uma maneira melhor de construir cadeias de conexão é com EntityConnectionStringBuilder:

public static string GetSqlCeConnectionString(string fileName)
{
    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlServerCe.3.5";
    csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName);

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

public static string GetSqlConnectionString(string serverName, string databaseName)
{
    SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder();

    providerCs.DataSource = serverName;
    providerCs.InitialCatalog = databaseName;
    providerCs.IntegratedSecurity = true;

    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlClient";
    csBuilder.ProviderConnectionString = providerCs.ToString();

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

Se você ainda encontrar a exceção, abra a montagem no refletor e verifique os nomes dos arquivos para os arquivos .csdl, .ssdl e .msl. Quando os recursos tiverem nomes diferentes dos especificados no valor dos metadados, não funcionará.

user276695
fonte
8
Por favor, considere que "YourEdmxFileName" deve ser o nome qualificado, por exemplo, "YourNamespace.YourEdmxFileName", se você usar espaços para nome em sua montagem. No entanto, você deve remover a parte do espaço para nome que é igual ao nome do seu assembly.
Marcel
5
MSDN diz que o segundo parágrafo está errado. "Quando você usa curinga (*), o Entity Framework precisa procurar em todos os assemblies por recursos com o nome correto."
Craig Stuntz 12/08/10
Tenho certeza de que o espaço para nome não é relevante, mas o caminho do arquivo incorporado é. Portanto, mesmo que você inspecione o arquivo * .Designer.cs do arquivo edmx associado e observe que o espaço para nome da classe gerado automaticamente é MyCompany ... seja como for, não é o que você deve usar. Em vez disso, o caminho é assemblyname, nomes das pastas da solução / nome do arquivo. Por exemplo: "metadados = res: // * / EntityModels. <Nome do arquivo> .csdl |" + "res: // * / EntityModels. <nome do arquivo> .ssdl |" + "res: // * / EntityModels. <nome do arquivo> .msl;"
28411 Daniel
1
@ Daniel, isso está correto, mas observe que o espaço para nome e o caminho do arquivo incorporado às vezes são os mesmos. Você precisa procurar no Reflector (ou alternativa gratuita) para ter certeza.
Craig Stuntz
parece que funciona usando apenas o nome do assembly, sem versão, publickeytoken, etc. Como:res://MyAssembly/folder.<filename>.csdl...
Ivan Ferrer Villa
67

Eu tive um erro semelhante. Eu recriei o projeto (história longa) e retirei tudo do projeto antigo. Eu não tinha percebido que meu modelo estava em um diretório chamado 'Model' antes e agora estava em um diretório chamado 'Models'. Depois que mudei a conexão no meu Web.Config a partir disso:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl 

para isso:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl

Tudo funcionou (alterado Modelpara Models). Note que eu tive que mudar esses três lugares nessa string.

Rick Arthur
fonte
2
Mudei meu modelo do Entity Framework de Model para DAL. Mas então, quando escrevi um teste (uma semana depois) no projeto de teste para testar o construtor de predicados do Linq. Eu recebi esse erro. Corrigi os projetos de teste App.config com a aparência no web.config do projeto principal - como você disse em três locais. Então sua resposta simples me colocou no caminho certo.
Patrik Lindström
Sim, obrigado - verifique seu (s) nome (s) de arquivo. De alguma forma, eu tinha o nome antigo.
PeterX
7
Existe alguma diferença entre os dois ?!
Erwin Rooijakkers 02/12/13
2
@ErwinRooijakkers Model vs ModelS
Marc
Descobri que eu havia feito o mesmo depois de ler o blog de Craig, mas +1 para aprender é importante lembrar que as alterações feitas na sua biblioteca de classes "entidades" não são feitas automaticamente nos arquivos de configuração dos projetos que fazem referência a ele. Ainda bem que não estou sozinha.
Ruffin 01/03
26

E uma maneira rápida de verificar o nome do modelo sem o Reflector .... procure o diretório

... obj / {saída da configuração} / edmxResourcesToEmbed

e verifique se os arquivos de recurso .csdl, .msl e .ssdl estão lá. Se eles estiverem em um subdiretório, o nome do subdiretório deverá ser anexado ao nome do modelo.

Por exemplo, meus três arquivos de recursos estão em um subdiretório Data , portanto, minha cadeia de conexão teve que ser

metadados = res: // * / Data .MyModel.csdl | res: // * / Data .MyModel.ssdl | res: // * / Data .MyModel.msl;

(versus metadados = res: //*/MyModel.csdl | res: //*/MyModel.ssdl | res: //*/MyModel.msl;).

leqid
fonte
Este foi exatamente o meu problema. Perdeu várias horas com isso. Muito obrigado por essa explicação fácil #
Fernando Carvalhosa
Ótima resposta, na verdade, explica como encontrar qual é a sua string. E mostra que as subpastas têm '.' como delimitadores e não '\' ou '/'.
Cjb110 12/0218
16

Eu também tive esse problema e foi porque a cadeia de conexão no meu web.config era um pouco diferente da do app.config do assembly em que meu EDMX está localizado. Não faço ideia por que mudou, mas aqui estão as duas versões diferentes.

App.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SMCSModel.csdl|res://*/Model.SMCSModel.ssdl|res://*/Model.SMCSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Web.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SCMSModel.csdl|res://*/Model.SCMSModel.ssdl|res://*/Model.SCMSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

O que o corrigiu foi simplesmente copiar a string app.config (observe a pequena diferença no final - em vez de " App=EntityFramework" ele queria " application name=EntityFramework") para o web.config e o problema foi resolvido. :)

Ghlouw
fonte
1
Obrigado, este foi realmente o meu problema. Eu tinha 1 projeto que acessava o DB com EF e outro projeto WCF. Depois de alterar o nome do primeiro projeto, o connectionString foi alterado no App.config do meu primeiro projeto. Então eu tive que mudar o connectionString no projeto WCF aswell no web.config :)
Volkan
Na documentação do MSDN sobre docs.microsoft.com/en-us/dotnet/framework/data/adonet/… : The .NET Framework data provider for SQL Server (SqlClient) supports many keywords from older APIs, but is generally more flexible and accepts synonyms for many of the common connection string keywords.as seqüências de conexão do Entity Framework não compartilham essa flexibilidade, portanto, você deve usar apenas as palavras-chave que espera.
usar o seguinte comando
13

Isso aconteceu comigo quando alternei acidentalmente a ação de compilação do arquivo edmx (exibida em Propriedades no IDE) de 'EntityDeploy' para 'None'. EntityDeploy é o que preenche os metadados para você: consulte http://msdn.microsoft.com/en-us/library/cc982037.aspx

hgcummings
fonte
Essa foi a minha correção - renomei meu edmx para .old, enquanto o copiava e tentava algumas coisas, depois, quando o renomeei, a Ação de Construção definiu-a como nenhuma e, portanto, recebi esse erro, configurando-o novamente como EntityDeploy resolvido meu problema :)
eth0 21/03
Mudei meu arquivo EDMX para outra pasta e tive que alterar a ação de compilação para atualizar também os nomes dos recursos incorporados. Obrigado!
David
Essa foi a solução para mim; Eu tinha perdido essa configuração no processo de atualização para o .NET Standard. Obrigado por salvar minha sanidade!
NetherGranite
11

Isso acontece comigo quando eu não limpo a solução antes de criar um novo designer .edmx. Portanto, não esqueça de limpar a solução antes de criar o novo designer .edmx. Isso me ajuda a pular muito mais problemas com este. Abaixo os detalhes de navegação fornecidos, caso você seja novo no visual studio.

Clique em-> Criar-> Solução Limpa

Em seguida, clique em-> Criar-> Reconstruir Solução

Espero que isto ajude. Obrigado a todos

Liakat
fonte
8

Passei apenas 30 minutos felizes com isso. Eu havia renomeado o objeto de entidades, renomeado a entrada no arquivo de configuração, mas há mais ... você também precisa alterar a referência ao csdl

muito fácil de perder - se você estiver renomeando, certifique-se de obter tudo ....

TobyEvans
fonte
6

Eu tive o mesmo problema. Eu olhei em minha dll cumprida com refletor e vi que o nome do recurso não estava certo. Eu renomeei e parece bom agora.

Pitming
fonte
6

Para o meu caso, é resolvido alterando as propriedades do arquivo edmx.

  1. Abra o arquivo edmx
  2. Clique com o botão direito do mouse em qualquer local do designer do EDMX
  3. escolha propriedades
  4. atualizar Propriedade chamada "Processamento de artefato de metadados" para "Incorporar no conjunto de saída"

isso resolveu o problema para mim. O problema é que, quando o contêiner tenta encontrar os metadados, ele não pode encontrá-lo. simplesmente faça-o na mesma montagem. esta solução não funcionará se você tiver seus arquivos edmx em outro assembly

user464507
fonte
+1.000.000 foi esse o problema subjacente para mim hoje. Dificuldades de reorganizar os espaços para nome de um produto e consolidar montagens.
21813 Mike
6

Passei um dia inteiro nesse erro

se você estiver trabalhando com n-tear architecture

ou você tentou separate Modelsgerar pelo EDMXformulário DataAccessLayer paraDomainModelLayer

talvez você receba esse erro

  1. A primeira etapa da solução de problemas é garantir que a seqüência de conexão webconfig (UILayer)eappconfig (DataAccessLayer) são os mesmos
  2. Segundo, o que é muito importante connection string

    connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid.....

    qual é o problema

de onde eu cheguei Model ou qualquer outra coisa .csdl na minha cadeia de conexão onde eles estão

aqui eu nossa solução olhar para a foto

insira a descrição da imagem aqui

espero que a ajuda você

Basheer AL-MOMANI
fonte
5

Consegui resolver isso no Visual Studio 2010, VB.net (ASP.NET) 4.0.

Durante o assistente de modelo de entidade, você poderá ver a cadeia de conexão da entidade. A partir daí, você pode copiar e colar em sua cadeia de conexão.

A única coisa que me faltava era o "App_Code". na cadeia de conexões.

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"
Engenheiro de Internet
fonte
Infelizmente, a cadeia de conexão no assistente não está correta para app.config. O @leqid sugeriu uma boa maneira de corrigir o caminho para o modelo.
Der_Meister
5

Após horas pesquisando e tentando resolver, nenhuma das soluções sugeridas funcionou. Eu listei várias soluções aqui. Também notei o que funcionou para mim. (Eu estava usando o EF versão 6.1.1 e o SQL Server 2014 - mas um banco de dados mais antigo)

  1. Reconstruindo o projeto e tente novamente.
  2. Feche e abra o VS - não sei como isso funciona
  3. verifique se você colocou o arquivo .EDMX em um diretório, inclua os diretórios em seu ConnectionString. por exemplo, o meu está dentro da pasta DAL. Portanto, é assim: connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;(esses são arquivos. Para vê-los, você pode alternar Mostrar todos os arquivos no Solution Explorer, no diretório ~ / obj / ..)

... e muitas outras que eu tentei [como: reverter a versão do EntityFramework para uma versão posterior (não tenho certeza)]


o que funcionou para mim:

deste artigo aqui , me ajudou a resolver meu problema. Acabei de alterar meu ProviderManifestToken="2012"para ProviderManifestToken="2008"no arquivo EDMX. Para fazer isso:

Solution Explorer

  1. Clique com o botão direito do mouse no arquivo .edmx
  2. Abrir com..
  3. XML do editor
  4. Alterar ProviderManifestToken = "XXXX" com 2008

Espero que ajude.

ben
fonte
Recentemente, tive esse problema depois de fazer aparentemente nenhuma alteração. Tentei reiniciar o VS sem sucesso, mas foi corrigido pela limpeza e reconstrução. Portanto, para outros, se você não fez alterações e nada disso parece relevante, faça uma tentativa de limpeza / reconstrução.
Greg
5

Se você estiver usando o edmx de um projeto diferente, na cadeia de conexão, altere ...

metadata=res://*/Data.DataModel.csdl

...para...

metadata=res://*/DataModel.csdl
Graham Laight
fonte
Isso é verdade. Se você deseja movê-lo para sua nova subpasta do projeto, você precisa adicionar o folder.subfolderantes dele.
Qakmak
Obrigado, esta solução funcionou para mim. Eu havia movido meu arquivo .edmx de um diretório em um projeto para a raiz de outro projeto e precisava remover o nome do diretório de todas as seqüências de conexão da minha solução.
22419 Chris
4

A solução definitiva (mesmo depois de recriar o banco de dados em duas outras máquinas, bem como no EDMX e em outros artigos diversos) foi não usar a primeira edição do Entity Framework. Ansioso para avaliá-lo novamente no .NET 4.0.

Depois de encontrar o mesmo problema novamente e procurar por toda a resposta, finalmente encontrei alguém que tinha o mesmo problema. Parece que a cadeia de conexão não foi gerada corretamente pelo assistente do Visual Studio e o link para os recursos de metadados estava faltando um caminho importante.

v1.0 BUG ?: Não foi possível carregar o recurso de metadados especificado. Scripts! = Modelos

Atualização 2013-01-16 : Após a transição para o uso quase exclusivo das práticas do EF Code First (mesmo com bancos de dados existentes), esse problema não é mais um problema. Para mim, essa foi uma solução viável para reduzir a confusão de códigos e configurações gerados automaticamente e aumentar meu próprio controle sobre o produto.

J. Steen
fonte
4

Meu problema e solução, os sintomas eram os mesmos "Não foi possível carregar o recurso de metadados especificado", mas a causa raiz foi diferente. Eu tinha 2 projetos na solução, um era o EntityModel e o outro, a solução. Na verdade, eu excluí e recriei o arquivo EDMX no EntityModel.

A solução foi que eu tive que voltar ao projeto de aplicativo da Web e adicionar essa linha ao arquivo de configuração. O novo modelo havia alterado alguns itens que precisavam ser duplicados no arquivo Web.Config do "outro" projeto. A configuração antiga não era mais boa.

     <add name="MyEntities"
     connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;
                    provider=System.Data.SqlClient;
                    provider connection string=&quot;
                    data source=Q\DEV15;initial catalog=whatever;
                    user id=myuserid;password=mypassword;
                    multipleactiveresultsets=True;
                    application name=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />
John Peters
fonte
4

Às vezes, vejo esse erro no meu projeto. Eu resolvo isso

1 - Clique com o botão direito no arquivo EDMX

2 - Selecione a Run Custom Toolopção

3 - Projeto de reconstrução

MOH3N
fonte
Isso funcionou para mim, mas eu também tive que reconstruí-lo depois.
rdans 20/03/19
3

No meu caso, esse problema estava relacionado à renomeação do arquivo edmx do meu modelo ... a correção da cadeia de conexão app.config dos arquivos csdl / ssdl / msl corrigiu meu problema.

Se você estiver usando o designer EF 4.0 para gerar seu csdl / ssdl / msl, esses 3 "arquivos" serão realmente armazenados no arquivo edmx principal do modelo. Nesse caso, o post de Waqas está praticamente em jogo. É importante entender que "Model_Name" no exemplo dele precisará ser alterado para qualquer que seja o nome atual do arquivo .edmx do seu modelo (sem o .edmx).

Além disso, se o seu arquivo edmx não estiver no nível raiz do seu projeto, você deverá preceder Model_Name com o caminho relativo, por exemplo

res://*/MyModel.WidgetModel.csdl|res://*/MyModel.WidgetModel.ssdl|res://*/MyModel.WidgetModel.msl

especificaria que o xml csdl / ssdl / msl é armazenado no arquivo de modelo 'WidgetModel.edmx', que é armazenado em uma pasta chamada 'MyModel'.

Janmon
fonte
3

Eu escrevi essa classe auxiliar para criar instâncias de objetos ObjectContext quando eles são definidos em um projeto diferente do que o projeto que está usando. Analiso a cadeia de conexão no arquivo de configuração e substituo '*' pelo nome completo do assembly.

Não é perfeito porque usa reflexão para construir o objeto, mas é a maneira mais genérica de fazer isso que eu poderia encontrar.

Espero que ajude alguém.

public static class EntityHelper<T> where T : ObjectContext
{
    public static T CreateInstance()
    {
        // get the connection string from config file
        string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString;

        // parse the connection string
        var csBuilder = new EntityConnectionStringBuilder(connectionString);

        // replace * by the full name of the containing assembly
        csBuilder.Metadata = csBuilder.Metadata.Replace(
            "res://*/",
            string.Format("res://{0}/", typeof(T).Assembly.FullName));

        // return the object
        return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T;
    }
}
lau
fonte
3

Para todos vocês SelftrackingEntities usuários, se você seguiu o Microsoft Walk-through e separou a classe de contexto Object no projeto de serviço wcf (vinculando-o ao contexto .tt), esta resposta é para você:

parte das respostas mostradas neste post que inclui códigos como:

... = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName); 

NÃO FUNCIONARÁ PARA VOCÊ !! o motivo é que YourObjectContextType.Assemblyagora reside em um Assembley diferente (dentro da montagem do projeto wcf),

Então você deve substituir YourObjectContextType.Assembly.FullName por ->

ClassTypeThatResidesInEdmProject.Assembly.FullName 

diverta-se.

Robocide
fonte
2

Eu estava tendo problemas com essa mesma mensagem de erro. Meu problema foi resolvido fechando e reabrindo o Visual Studio 2010.

Adão
fonte
2

Teve o mesmo problema porque renomeei um assembly.

Eu também tive que renomeá-lo nos atributos AssemblyTitle e AssemblyProduct no projeto Properties / AssemblyInfo.cs, além de excluir e adicionar novamente a referência ao arquivo edmx.

Então funcionou muito bem.

Antoine Meltzheim
fonte
2

Com o mesmo problema, recriei o edmx a partir do banco de dados. Resolve meu problema.

صفي
fonte
2
Infelizmente, isso aborda e trata o sintoma, não a causa.
Clarice Bouwer
2

A exceção ocorre porque o compilador aponta para metadados inexistentes, apenas copie o app.config connectionstring para o Web.configConnectionString

Krishna shidnekoppa
fonte
1

Eu também tive o mesmo problema e solução de Rick, exceto que estava importando um .edmx existente para um novo projeto e, embora o namespace base não importasse, ele foi importado para um subdiretório diferente, então eu também tive que atualizar a conexão string dentro do Web.Config em três locais, para incluir os diferentes nomes de subdiretórios:

eagle779
fonte
1

Eu tive o mesmo problema com uma solução que continha projetos em uma pasta de soluções, quando eles foram movidos para a raiz da solução (para superar uma falha suspeita no Mvc3AppConverter devido aos locais do projeto).

Embora a solução tenha sido compilada depois que todas as * referências do projeto foram adicionadas, conforme necessário, o erro foi gerado quando o site foi acionado.

O EDMX está em um dos projetos que foram movidos (o projeto 'Data'), mas é claro que a falta de uma referência ao projeto Data não causou um erro de compilação, apenas um erro em tempo de execução.

Simplesmente adicionar a referência ausente ao projeto principal resolveu esse problema, sem a necessidade de editar a conexão.

Espero que isto ajude alguém.

Chris
fonte
1

Quanto a mim, eu tinha separado a camada de acesso a dados e a camada de interface do usuário. Então, eu tenho uma string de conexão de entidade para cada camada.

Antes de modificar essas duas seqüências de conexão separadas para serem as mesmas, ainda encontrei o erro abaixo.

Unable to load the specified metadata resource

Então, eu faço para ser as mesmas seqüências de conexão para essas duas camadas (DAL, UI), funciona perfeitamente.

Minha solução é fazer com que todas as cadeias de conexão sejam as mesmas, independentemente de onde elas já sejam apresentadas .

Frank Myat Thu
fonte
1

Eu tive esse problema ontem e estava olhando para o meu código na depuração e na saída do SQL Profiler.

O que eu não conseguia entender, antes de ler e entender esta postagem, era o motivo pelo qual o EntityFramework estava lançando esse erro ao chamar o banco de dados. Eu estava olhando centenas de linhas no SQL Profiler tentando descobrir o que havia de errado com o modelo de banco de dados. Não consegui encontrar nada parecido com a ligação que esperava e, para ser sincero, não tinha certeza do que estava procurando.

Se você estiver nesta posição, verifique a cadeia de conexão. Meu palpite é que, antes que o EntityFramework crie seu SQL, ele verificará o modelo, especificado na parte de metadados da cadeia de conexão. No meu caso, estava errado. O EntityFramework nem chegou a chegar ao DB.

Verifique se os nomes estão corretos. Depois que eu resolvi isso, eu estava vendo chamadas no SQL Profiler onde o ApplicationName era 'EntityFramework', com o SQL chamando as tabelas esperadas.

Daniel Hollinrake
fonte
1

Um arquivo app.config ou web.config ruim pode fazer isso. Eu copiei a cadeia de conexão app.config para o meu web.config na minha interface do usuário e acabei inserindo:

<connectionStrings>
    <connectionStrings>
          <add name="name" connectionString="normalDetails"/>
    </connectionStrings>
</connectionStrings>
MyDaftQuestions
fonte