Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Aula 3 - Erro no Ninject

Olá, professor Victor!

Peço imensas desculpas por não ter respondido o tópico "Erro no WebActivator do meu projeto LojaWebEF (aula 2)". Eu precisei dar uma breve pausa no curso e estou retornando agora.

O erro que relatei naquele tópico me impedia de executar o projeto. Então, na classe NinjectWebCommon.cs, substituí WebActivator por WebActivatorEx, como abaixo, e consegui executar o projeto.

Classe NinjectWebCommon.cs com WebActivator:

[assembly: WebActivator.PreApplicationStartMethod(typeof(LojaWebEF.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(LojaWebEF.App_Start.NinjectWebCommon), "Stop")]

Classe NinjectWebCommon.cs com WebActivatorEx:

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(LojaWebEF.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(LojaWebEF.App_Start.NinjectWebCommon), "Stop")]

Quando fiz a configuração de injeção de dependência, no fim dos exercícios da aula 2, passei a receber o seguinte erro, logo após executar o projeto, ao abrir a página web inicial:

Erro de Servidor no Aplicativo '/'.

Erro de configuração

Descrição: Erro durante o processamento de um arquivo de configuração necessário para o serviço desta solicitação. Examine os detalhes específicos do erro e modifique esse arquivo de configuração apropriadamente. 

Mensagem de Erro do Analisador: Ocorreu um erro ao criar o manipulador de seção de configuração de entityFramework: Não foi possível carregar arquivo ou assembly 'EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' ou uma de suas dependências. A definição do manifesto do assembly localizado não corresponde à referência do assembly. (Exceção de HRESULT: 0x80131040)

Erro de Origem: 


Linha 7:    <configSections>
Linha 8:      <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
Linha 9:      <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
Linha 10:   </configSections>
Linha 11:   <connectionStrings>

Arquivo de Origem: C:\...\LojaWebEF\LojaWebEF\web.config    Linha: 9 

Rastreamento do Carregamento de Assembly: As informações a seguir podem ser úteis para determinar por que o assembly 'EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' não pôde ser carregado.

Não estou conseguindo prosseguir com os exercícios da aula 3 devido a este erro. Você poderia me dar um auxílio, por favor?

Muito obrigado!

Alessandro Larangeiras.

8 respostas

Comparei o meu projeto web com o projeto console, desenvolvido na aula 1, e verifiquei uma diferença de versão do Ninject. Estou usando a versão 6 e o projeto web importado tem configurada a versão 5.

Fiz a mudança de configuração no arquivo web.config, como abaixo,mas o erro continua:

  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>

Você poderia me dar um auxílio, por favor?

Muito obrigado!

Alessandro Larangeiras.

solução!

Olá Alessandro

Essa diferença que existe entre o projeto da primeira aula e o da segunda acontece por que a interface gráfica do Nuget sempre pega a última versão das bibliotecas. Quando o curso foi escrito (e o projeto web criado), a versão mais atual era a cinco, atualmente é a seis.

O erro que você está tendo na aplicação acontece quando a máquina virtual do C# não consegue encontrar uma biblioteca no seu projeto. Por algum motivo o seu, no seu projeto, a CLR não está conseguindo carregar o Entity Framework 5 corretamente.

Para tentar corrigir o problema, abra o Package Manager Console do Visual Studio, o mesmo que você usou para habilitar as migrations, e digite o comando

Update-Package -Reinstall

Esse comando força o nuget a baixar novamente todas as dependências do projeto. Depois disso, tente executar novamente a aplicação.

Se você tiver algum problema com o comando, por favor poste a nova stack trace.

Referências para os comandos do Nuget: http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html http://docs.nuget.org/docs/workflows/reinstalling-packages

Olá, professor Victor!

A sua sugestão de correção funcionou. Tive de atualizar a versão do NuGet e refazer a importação do projeto web zipado para, só então, executar o comando, mas consegui fazer o site rodar.

Agora, quando clico no link "Lista De Produtos", no site, recebo a seguinte exceção:

An error occurred while getting provider information from the database. This can be caused by Entity Framework using an incorrect connection string. Check the inner exceptions for details and ensure that the connection string is correct.

Ao tentar abrir o banco de dados "LojaEF.mdf" no SERVER EXPLORER, recebo a seguinte mensagem de erro:

O banco de dados '...\LOJAWEBEF\LOJAWEBEF\APP_DATA\LOJAEF.MDF' não pode ser aberto porque sua versão é a 706. Este servidor suporta a versão 655 e anteriores. O caminho de desatualização não é suportado.
Não foi possível abrir o novo banco de dados '...\LOJAWEBEF\LOJAWEBEF\APP_DATA\LOJAEF.MDF'. CREATE DATABASE foi anulado.
Falha na tentativa de anexar um banco de dados auto-denominado no arquivo ...\LojaWebEF\LojaWebEF\App_Data\LojaEF.mdf. Existe um banco de dados com o mesmo nome, o arquivo especificado não pode ser aberto, ou está localizado em um compartilhamento UNC.

Se a minha interpretação estiver correta, a mensagem de erro sugere que o SQL Server está desatualizado, mas eu cheguei a fazer uma instalação nova exclusivamente para o curso de Entity Framework. Também excluí o banco de dados "LojaEF.mdf", criado nos exercícios da aula 1, para evitar incompatibilidade por nome, embora o erro continue ocorrendo.

Você poderia me dar um auxílio, por favor?

Muito obrigado!

Alessandro Larangeiras.

Oi Alessandro

Parece que o seu Visual Studio está utilizando uma versão antiga do SQL Server Express Edition e por isso ele não está conseguindo abrir o banco do projeto.

Para tentar resolver o problema, abra o pasta App_Data do projeto dentro do Visual Studio e apague a o Loja.mdf e depois abra o explorer e entre na pasta App_Data do projeto. Dentro dessa pasta verifique se o arquivo foi realmente apagado pelo sistema operacional.

Depois que o arquivo tiver sido removido, tente criar novamente o service-based database pelo Visual Studio e rode novamente a aplicação.

Se não der certo, você poderia postar qual é a versão do Visual Studio e o sistema operacional que você está utilizando? Além disso, tente postar a stack trace completa.

Olá, professor Victor!

Segui as suas instruções e recriei o banco "LojaEF.mdf". A única diferença é que, no submenu ADD | NEW ITEM, do meu Visual Studio, não havia a opção SERVICE-BASED DATABASE, então utilizei a opção SQL SERVER DATABASE. Depois deste passo, consegui abrir o banco "LojaEF.mdf" no SERVER EXPLORER normalmente.

Contudo, ao executar o projeto e clicar no link "Lista De Produtos", no site, o erro continua acontecendo.

No Debug do Visual Studio, eu recebo esta mensagem de erro:

An error occurred while getting provider information from the database. This can be caused by Entity Framework using an incorrect connection string. Check the inner exceptions for details and ensure that the connection string is correct.

No site, a URI acessada é: http://localhost:2086/Produtos e o Stack Trace completo que recebo é:

Erro de Servidor no Aplicativo '/'.

O sistema não pode encontrar o arquivo especificado

Descrição: Ocorreu uma exceção sem tratamento durante a execução da atual solicitação da Web. Examine o rastreamento de pilha para obter mais informações sobre o erro e onde foi originado no código. 

Detalhes da Exceção: System.ComponentModel.Win32Exception: O sistema não pode encontrar o arquivo especificado

Erro de Origem: 


Linha 13:     </thead>
Linha 14:     <tbody>
Linha 15:         @foreach(var produto in @Model) 
Linha 16:         {
Linha 17:             <tr>

Arquivo de Origem: ...\LojaWebEF\LojaWebEF\Views\Shared\_ListaProdutos.cshtml    Linha: 15 

Rastreamento de Pilha: 


[Win32Exception (0x80004005): O sistema não pode encontrar o arquivo especificado]

[SqlException (0x80131904): Erro de rede ou específico à instância ao estabelecer conexão com o SQL Server. O servidor não foi encontrado ou não estava acessível. Verifique se o nome da instância está correto e se o SQL Server está configurado para permitir conexões remotas. (provider: SQL Network Interfaces, error: 52 - Não é possível localizar uma instalação de Tempo de Execução de Banco de Dados Local. Verifique se o SQL Server Express está instalado corretamente e se o recurso Tempo de Execução de Banco de Dados Local está habilitado.)]
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5295167
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +242
   System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) +5307115
   System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) +145
   System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) +920
   System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) +307
   System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions) +434
   System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +225
   System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) +37
   System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnectionOptions userOptions) +558
   System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnectionOptions userOptions) +67
   System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) +1052
   System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) +78
   System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) +167
   System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) +143
   System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) +83
   System.Data.SqlClient.SqlConnection.Open() +96
   System.Data.SqlClient.SqlProviderServices.UsingConnection(SqlConnection sqlConnection, Action`1 act) +79
   System.Data.SqlClient.SqlProviderServices.UsingMasterConnection(SqlConnection sqlConnection, Action`1 act) +384
   System.Data.SqlClient.SqlProviderServices.GetDbProviderManifestToken(DbConnection connection) +241
   System.Data.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection) +26

[ProviderIncompatibleException: O provedor não retornou uma cadeia de caracteres ProviderManifestToken.]
   System.Data.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection) +170
   System.Data.Entity.ModelConfiguration.Utilities.DbProviderServicesExtensions.GetProviderManifestTokenChecked(DbProviderServices providerServices, DbConnection connection) +66

[ProviderIncompatibleException: An error occurred while getting provider information from the database. This can be caused by Entity Framework using an incorrect connection string. Check the inner exceptions for details and ensure that the connection string is correct.]
   System.Data.Entity.ModelConfiguration.Utilities.DbProviderServicesExtensions.GetProviderManifestTokenChecked(DbProviderServices providerServices, DbConnection connection) +225
   System.Data.Entity.ModelConfiguration.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest) +87
   System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) +82
   System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) +143
   System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input) +171
   System.Data.Entity.Internal.LazyInternalContext.InitializeContext() +493
   System.Data.Entity.Internal.InternalContext.Initialize() +31
   System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) +39
   System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() +137
   System.Data.Entity.Internal.Linq.InternalSet`1.GetEnumerator() +38
   System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.IEnumerable.GetEnumerator() +99
   ASP._Page_Views_Shared__ListaProdutos_cshtml.Execute() in ...\LojaWebEF\LojaWebEF\Views\Shared\_ListaProdutos.cshtml:15
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +197
   System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +97
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +88
   System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +260
   System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +115
   System.Web.Mvc.HtmlHelper.RenderPartialInternal(String partialViewName, ViewDataDictionary viewData, Object model, TextWriter writer, ViewEngineCollection viewEngineCollection) +276
   System.Web.Mvc.Html.PartialExtensions.Partial(HtmlHelper htmlHelper, String partialViewName, Object model, ViewDataDictionary viewData) +108
   System.Web.Mvc.Html.PartialExtensions.Partial(HtmlHelper htmlHelper, String partialViewName, Object model) +32
   ASP._Page_Views_Produtos_Index_cshtml.Execute() in ...\LojaWebEF\LojaWebEF\Views\Produtos\Index.cshtml:9
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +197
   System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +97
   System.Web.WebPages.StartPage.RunPage() +17
   System.Web.WebPages.StartPage.ExecutePageHierarchy() +62
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +76
   System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +260
   System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +115
   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +295
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
   System.Web.Mvc.<>c__DisplayClass1a.<InvokeActionResultWithFilters>b__17() +23
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +242
   System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +21
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +242
   System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +21
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +177
   System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +89
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +102
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +43
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +57
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +47
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +47
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9635852
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

Informações sobre a Versão: Microsoft .NET Framework Versão:4.0.30319; Versão do ASP.NET:4.0.30319.17929

A plataforma de desenvolvimento que estou utilizando é:

  • Sistema Operacional Microsoft Windows Vista Home Basic.
    • Microsoft Visual Studio 2010 Ultimate, version 10.0.40219.1 SP1Rel.
    • Microsoft .NET Framework version 4.5.50709 SP1Rel.
    • Hotfixes: KB2581019, KB2591016, KB983509 (Service Pack 1).
    • Microsoft ASP.NET MVC2, MVC3 e MVC4.
    • NuGet Package Manager 2.8.50313.31.
    • Microsoft SQL Server Compact 3.5 SP1.
    • Microsoft SQL Server 2008.

Você poderia me dar um auxílio, por favor?

Muito obrigado!

Alessandro Larangeiras.

No Debug do Visual Studio também estou recebendo o seguinte warning:

Warning    1    ...\LojaWebEF\LojaWebEF\Views\Shared\_ListaProdutos.cshtml: ASP.NET runtime error: Os assemblies de referência para a versão de destino do .NET Framework não foram encontrados; verifique se eles foram instalados ou selecione uma versão de destino válida.

Oi Alessandro

Tente modificar a String de conexão do projeto para que ela seja a mesma que está sendo utilizada pelo visual studio. Para descobrir a string de conexão, dentro do solution explorer do Visual Studio, abra a pasta App_Data do projeto e dê um duplo clique no arquivo Loja.mdf, isso deve abrir uma janela chamada Database Explorer.

Dentro dessa nova janela, clique com o botão direito no Loja.mdf e escolha a opção Properties. Na janela properties, procure uma opção chamada Connection String essa é a string de conexão que foi montada pelo Visual Studio. Copie essa String.

Depois de copiar a string de conexão, abra o arquivo de configuração do projeto, o Web.Config (o que fica direto na raíz do projeto e não o da pasta Views). Dentro desse arquivo, procure uma tag chamada connectionStrings e dentro dela substitua a connection string configurada pela que você acabou de copiar.

Essa configuração deve ficar parecida com a abaixo:

<connectionStrings>
  <add name="EntidadesContext"
       providerName="System.Data.SqlClient"
       connectionString="<valor que você copiou>"
  />
</connectionStrings>

Depois que você copiar terminar de colar a string de conexão, o seu arquivo deve ficar com um erro por que a string de conexão gerada pelo visual studio contém aspas. Para corrigir o problema, simplesmente tire todas as aspas que da connectionString deixando apenas a primeira e a última.

Para terminar, a connectionString possui uma configuração chamada AttachDbFileName que é o caminho para o arquivo mdf do banco de dados. Como o arquivo foi colocado dentro da pasta app_data do projeto, podemos substituir o caminho completo por:

AttachDbFilename=|DataDirectory|Loja.mdf;

Dentro de um projeto web, o |DataDirectory| representa a pasta App_Data.

Tente fazer essa configuração e se você tiver algum problema, poste a string de conexão gerada pelo visual studio que eu te ajudo a fazer a modificação no arquivo de configuração.

Olá, professor Victor!

A correção da string de conexão funcionou 100%! Segui todos os detalhes da sua orientação e deu tudo certo.

O projeto rodou, consegui acessar os links das listas de produtos, categorias e usuários, no site, e o banco de dados "LojaEF.mdf" teve todas as tabelas criadas, conforme esperado.

Agora, posso dar continuidade aos exercícios da aula 3.

Muito obrigado por todo o auxílio!

Um grande abraço!

Alessandro Larangeiras.