Exceção EF 4.1 “O provedor não retornou uma string ProviderManifestToken”

88

Estou tentando replicar um exemplo encontrado no MSDN. Estou usando ASP.NET e EF 4.1 (CTP?). Usei o NuGet para instalar o pacote EntityFramework.

Estou recebendo este erro: The provider did not return a ProviderManifestToken string... e o banco de dados nunca é criado.

Aqui está minha string de conexão:

<add name="HospitalContext"
   connectionString=
   "data source=.\SQLExpress;initial catalog=NewTestDB;integrated security=True;"
   providerName="System.Data.SqlClient"/>

Aqui está o meu código:

var pat = new Patient { Name = "Shane123132524356436435234" };
db.Patients.Add(pat);

var labResult = new LabResult { Result = "bad", Patient = pat };

int recordAffected = db.SaveChanges();

Aqui está o meu contexto:

public class HospitalContext : DbContext
{
    static HospitalContext()
    {
        Database.SetInitializer(new HostpitalContextInitializer());
    }

    public DbSet<Patient> Patients { get; set; }
    public DbSet<LabResult> LabResults { get; set; }
}

public class HostpitalContextInitializer :
             DropCreateDatabaseIfModelChanges<HospitalContext>
{
    protected override void Seed(HospitalContext context)
    {
        context.Patients.Add(new Patient { Name = "Fred Peters" });
        context.Patients.Add(new Patient { Name = "John Smith" });
        context.Patients.Add(new Patient { Name = "Karen Fredricks" });
    }
}

Este é um sistema SQL 2008 totalmente atualizado, com VS 2010 SP1.

bugnuker
fonte
Parece que depois de adicionar [Chave] ao Modelo, está trabalhando além desse problema. Ainda estou com outro problema, mas isso pode ter resolvido o problema.
bugnuker
Além disso, pode ser que eu tenha adicionado "Segurança integrada = true" à minha string de conexão ...
bugnuker
Estou tendo a mesma exceção ao trabalhar comSqlServerCe.Entity.dll
Nano Taboada
2
No interesse de coisas que podem evocar essa exceção - eu gasto 20 minutos encarando o erro de digitação no nome da string de conexão que deve corresponder ao nome do contexto.
JustSteve

Respostas:

184

Eu estava recebendo este erro e tentei algumas das sugestões anteriores. Em seguida, verifiquei a Exceção interna e percebi que estava obtendo uma falha simples de login do SQL para o usuário. Apenas outra coisa para verificar.

lixo
fonte
No meu caso, a senha do servidor sql expirou
mklein
3
Obrigado por me apontar na direção certa. Meu serviço SQL Express não foi iniciado - duh!
camainc
Boa ol exceção interna ... eu tinha meu nome de banco de dados errado quando apontei EF para um novo local de backup ... engraçado, eu verifiquei o InnerEx e seu comentário me fez voltar e relê-lo ... parabéns!
Andy Danger Gagne
Estava usando segurança integrada, o IIS AppPool não tinha os direitos necessários.
Vincent Vancalbergh
+1 - (Meu ip inicial mudou) Mensagem de erro: Não é possível abrir o servidor 'SERVERNAME' solicitado pelo login. O cliente com endereço IP 'MY_OLD_IP' não tem permissão para acessar o servidor. Para habilitar o acesso, use o Portal do SQL Azure ou execute sp_set_firewall_rule no banco de dados mestre para criar uma regra de firewall para este endereço IP ou intervalo de endereços. Pode levar até cinco minutos para que essa alteração tenha efeito. \ R \ nFalha de login para o usuário 'MYADMINACCT'. \ R \ nEsta sessão foi atribuída uma ID de rastreamento de 'GUID'. Forneça este ID de rastreamento ao suporte ao cliente quando precisar de assistência. "}
Dylan Hayes
8

Isso pode acontecer às vezes quando você coloca a string de conexão no app.config do projeto errado no Visual Studio.

Por exemplo, eu tive esse problema no projeto EF 4.1 (a versão lançada) + projeto WCF Data Service e percebi que não tinha uma string de conexão especificada no projeto Data Services, onde ela estava sendo usada.

Preet Sangha
fonte
Esta foi a minha solução. Tive que colocar a string de conexão adequada no projeto de inicialização.
MickJuice
5

Eu estava tendo o mesmo erro e, na verdade, foi uma falha de login para o servidor especificado. Removi o atributo "Segurança Integrada" da string de conexão de configuração e funcionou.

Rakesh Singh
fonte
Isso funcionou para mim. Qualquer outra pessoa com esse problema deve tentar fazer isso se as outras soluções não estiverem funcionando.
Justin
Este erro ocorreu quando o serviço SQL Express foi desligado em minha máquina.
John M
4

Eu tive o mesmo problema e adiciono o código abaixo logo após a instância do meu contexto (onload por exemplo)

context.Database.Connection.ConnectionString = @"Data Source=.\SQLExpress;Initial Catalog=Test;Integrated Security=True";
toto123
fonte
4

Tive um problema semelhante com o aplicativo MvcMusicStore. Mudei uma linha no Web.config de "Instance = true" para "Instance = false". Às vezes funciona sem esse ajuste, mas não sei o que causa a diferença. Ler este http://msdn.microsoft.com/en-us/library/ms254504.aspx realmente não ajudou.

xuvion
fonte
Incrível ... essa foi a solução adequada para mim. Eu não tenho ideia do porquê.
Kees C. Bakker de
2

Por alguma razão certa de permissão, EF não pode criar conexão de banco de dados. Eu havia enfrentado o mesmo problema em um dia inteiro. Finalmente tentei a seguinte solução e funcionou: a / Abra o IIS (estou usando o IIS 7) b / Abra as configurações avançadas do appool que o site estava usando (Ex: DefaultAppPool) c / Veja o grupo Modelo de Processo, altere o valor de Identidade para "Localsystem"

Espero que funcione com você.

Telvin Nguyen
fonte
2

Eu estava tendo o mesmo problema ...
a solução que funcionou para mim foi:
execute a ferramenta de configuração de rede do cliente (digite cliconfg em Executar)
e verifique se o TCP / IP está ativado ..

user1168945
fonte
2

Eu finalmente consegui decifrá-lo - depois de uma ligeira perseguição de ganso selvagem pensando que era devido às permissões.

Revelação: USE SQL PROFILER

(Nota: Recentemente fiz downgrade de EF6 para EF5)

Usando o SQL Profiler, encontrei rapidamente o último SQL executado antes da falha relatada:

SELECT TOP (1) 
[Project1].[C1] AS [C1], 
[Project1].[MigrationId] AS [MigrationId], 
[Project1].[Model] AS [Model]
FROM ( SELECT 
    [Extent1].[MigrationId] AS [MigrationId], 
    [Extent1].[Model] AS [Model], 
    1 AS [C1]
    FROM [dbo].[__MigrationHistory] AS [Extent1]
)  AS [Project1]
ORDER BY [Project1].[MigrationId] DESC

Bem, olhe para isso - algo a ver com migrações. Está olhando na __MigrationHistorytabela - que eu nem tinha percebido que ela havia criado (eu já tinha apagado as Migrações no meu CSPROJ) e limpei isso.

Então, eu puxo as linhas dessa tabela e vejo que ela está vinculada a uma versão específica do produto (v6).

insira a descrição da imagem aqui

Na verdade, fiz o downgrade do EF6 (que não pretendia instalar em primeiro lugar) para o EF5 (que é mais compatível com andaimes) e isso quando os problemas começaram.

Meu palpite é que a Model (<Binary data>)coluna não é compatível com versões anteriores - daí o The provider did not return a ProviderManifest instanceerro, pois não foi possível decodificá-la.

Eu não tinha nada a perder e simplesmente limpei esta mesa completamente e corri Update-Database -Verbosee depois voltei a funcionar.

Se você está em um ambiente avançado ou já em produção, apagar esta tabela pode não ser a solução, mas dessa forma me permitiu voltar ao trabalho.

Simon_Weaver
fonte
Acabei descartando a tabela __MigrationsHistory completamente e reenquadrando com Add-Migratione Update-Database -Verbose -Force. aqui está uma referência de comando coding.abel.nu/2012/03/ef-migrations-command-reference
Simon_Weaver
o ponto importante é que isso não é apenas um erro de permissão
Simon_Weaver
1

Ao usar o Visual Studio 11 Beta com EF4.1 e ASP.NET MVC, quase puxei meu cabelo até descobrir

http://connect.microsoft.com/VisualStudio/feedback/details/740623/asp-net-mvc-4-default-connection-string-improperly-escaped

Para corrigir meu problema, entrei em Application_Start e mudei

Database.DefaultConnectionFactory = new SqlConnectionFactory ("Fonte de dados = (localdb) \ v11.0; Segurança integrada = True; MultipleActiveResultSets = True");

para

Database.DefaultConnectionFactory = new SqlConnectionFactory ( @ "Fonte de dados = (localdb) \ v11.0; Segurança integrada = True; MultipleActiveResultSets = True");

GaTechThomas
fonte
Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");foi adicionado ao meu Mainmétodo, agora funciona como um encanto! Muito obrigado.
rotgers de
1

Este erro está presente apenas enquanto o arquivo .edmx está aberto e desaparece assim que o arquivo é fechado novamente.

Esta citação do CodePlex funcionou comigo (visual studio 2013 / MVC 5)

Feras
fonte
Trabalhou comigo também. Tentei fechar e reabrir o arquivo edmx. Trabalhou.
Rohit
1

Outra coisa a se considerar se você estiver usando EF Code First é que às vezes ele não cria automaticamente o banco de dados de apoio para sua classe DbContext. A solução é adicionar sua própria string de conexão - você pode usar a string de conexão que pode estar presente para lidar com o banco de dados de usuário / registro que apóia o Provedor de Associação Simples, como um modelo. Finalmente, você precisará adicionar um construtor padrão para a classe DbContext que você criou:

public ChaletDb():base("ChaletConnection")
    {

    }

Aqui, o nome da string de conexão conforme você inseriu em seu arquivo web.config é usado para direcionar o DbContext para criar o banco de dados. Muito ocasionalmente, tive que criar manualmente o banco de dados (no SQL Server Management Studio) que o fazia funcionar.

John Kelleher
fonte
0

Tenho vários projetos em uma solução e adicionei EF a cada projeto em momentos diferentes. Em algumas máquinas estava funcionando e em outras falhou com o erro mencionado. Levei um tempo para perceber que alguns dos app.config do meu projeto tinham isto:

    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0" />
  </parameters>
</defaultConnectionFactory>

Isso está ok se você usar LocalDb (novo "sql express" como), mas completamente errado se você não tiver aquele servidor específico instalado e usar um SQL regular.

Solução: Remova o código acima.

Oleg K
fonte
0

Isso ocorre porque a conexão com o servidor SQL falhou.

Certifique-se de que a conta de usuário sob a qual você está executando o processo tenha acesso ao SQL Server.

Se você gerou o DbContext a partir do encadeamento pai (como usar injeção de dependência) e, em seguida, se estiver representando outro usuário, esse erro ocorreria. A solução seria gerar o DbContext dentro do novo thread ou novo contexto de representação.

justcoding121
fonte
0

Acabei de fechar todas as instâncias do Visual Studio e reabrir minha solução.

Não sei o que realmente aconteceu, mas tive a mesma solução aberta em dois espaços de trabalho locais diferentes (um com minhas alterações locais, um com o código-fonte do repositório inalterado). Trabalho com um banco de dados postgres, Entity Framework 6, Visual Studio 2013 e ASP.NET MVC 5.

Cara pascalou
fonte
0

Eu tive um erro para estrutura de entidade, mas nenhuma das respostas acima acabou se encaixando na solução que finalmente funcionou.

Meus modelos EntityFramework Code First e DataContext estavam em um projeto separado do meu projeto principal WebAPI. Meu projeto do Entity Framework em algum ponto da linha de codificação foi definido como o projeto de inicialização e, portanto, quando eu estava executando uma migração, recebia “O provedor não retornou uma string ProviderManifestToken” ... problema de conexão.

Acontece que, como ConnectionString para o banco de dados está localizado no arquivo Web.config no projeto WebAPI principal, quando eu estava executando uma migração, a string de conexão não estava sendo recuperada. Ao definir o projeto WebAPI como meu startProject, consegui me conectar com êxito.

Ninja insone
fonte