Controlador de andaimes não funciona com o visual studio 2013 update 2

PROBLEMA:

Eu atualizei para o Visual Studio 2013 atualização 2 e agora não posso scaffold controladores.

O problema não é específico do projeto: quando tento criar um controlador, recebo o seguinte erro em TODOS e em QUALQUER projeto:

There was an error running the selected code generator: 'Exception has been thrown by the target of an invocation.' 

Ele estava funcionando antes de atualizar para o Visual Studio 2013 atualização 2.

Ter pesquisado o assunto até a morte, mas nenhuma das várias sugestões funciona

Por exemplo:

  1. Comentando OnModelCreating no meu contexto;

  2. Remoção de pacotes como o MvcScaffolding, etc (não tenho nenhum instalado e não funciona com QUALQUER projeto);

Modifiquei / personalizei alguns dos modelos, mas estava funcionando após as alterações.

EDITAR:

Eu desinstalei o Visual Studio 2013 Update 2 e, portanto, reverti para o Visual Studio versão 12.0.21005.1 REL.

O problema desapareceu. Portanto, o problema é definitivamente com a atualização 2.

QUESTÃO:

Alguém (incluindo a Microsoft) sabe de uma correção?

EDIT 2:

A resposta de Farruk Subhani não aborda a questão: A questão afirma claramente que a remoção de referências ao MVCScaffolding não resolve o problema.

Eu adicionei uma recompensa de 200 pontos, por favor, abordar a questão como claramente indicado.

Ei, para todos vocês que nada funciona, a verdadeira resposta é que você precisa remover QUALQUER COISA que tenha um configSource no web.config e a string de conexão precise ser embutida.

EDITAR:

Alguém apontou que ele precisa ser apenas as , e NÃO usando um atributo configSource. E que ele ainda era capaz de usar os atributos do configSource em outro lugar, como a tag rewriter.

Eu acho que é que o ferramental não pode seguir os locais do configSource para as coisas que ele usa como strings de conexão e configurações de aplicativos.

A Microsoft deve estar nesse problema, se não for corrigida ainda.

EDIT 2:

Até mesmo o pensamento @awrigley marcou sua resposta como correta, é um bug conhecido do Visual Studio. Eu consegui dizer então e acho que vai receber alguma atenção em breve. https://github.com/aspnet/Tooling/issues/169#issuecomment-144197015

Uma combinação de coisas funcionou para mim:

  1. Atualize para o Visual Studio 2013 Atualização 3.

  2. Atualizar o Entity Framework para 6.1.1

  3. Modifique a configuração de contexto para usar IDbSet <...> em vez de DbSet <...> (ouvi dizer que isso pode afetar o uso de ações assíncronas, mas aparentemente não no meu caso, já que uso isso em minhas ações de login, etc) como fornecido pelo pacote Nuget de amostra do ASP.NET Identity 2).

Por que essa combinação funciona, não faço ideia. Mas então, dado o silêncio trovejante de MS, eu provavelmente não estou sozinho. Eu acho que a atualização 2 simplesmente não funcionou …

Solução

Certifique-se de seção

 .. 

é depois

 .. 

Por favor, execute o seguinte comando no Console do Gerenciador de Pacotes :

 Uninstall-Package EntityFramework -Force Install-Package EntityFramework Uninstall-Package MvcScaffolding Install-Package MvcScaffolding 

Eu tive o mesmo problema com o Visual Studio 2013 Update 3, mas apenas para os scaffolders que trabalham com o Entity Framework. O problema é aparentemente causado pela incompatibilidade entre o Entity Framework 6.1.0 e os scaffolders no Visual Studio 2013 Update 2 e acima.

Para atualizar o EF, faça o seguinte:

Desinstalar-Package EntityFramework -Force

Install-Package EntityFramework

Esta resposta é emprestada daqui

Após a atualização, os scaffolders estão funcionando bem para mim. Certifique-se de instalar a nova versão em todos os projetos em que o Entity Framework é necessário.

No meu caso, eu resolvi o problema com a string de conexão no web.config.

Previuos a questão que tenho

   

e eu não sei porque, mas não consigo conectar ao database e falhar.

depois da mudança

    

e funciona

Eu vou explicar aqui um pouco mais em inglês, então qualquer um pode entender. Espero que isso ajude alguém lá fora Isso ocorre porque o Visual Studio não consegue se conectar ao modelo de database.

Isso acontece quando você altera o nome e / ou o caminho na class que estende o DbContext e não o altera no arquivo Web.config (na parte mais externa de seu projeto: a raiz).

Exemplo:

Imagine que você criou o código DbContext:

a) Você clicou com o botão direito do mouse em uma pasta em seu projeto e adicionou um “Modelo de Dados de Entidade ADO.NET” e nomeou-o como “Modelo1”.

Você obtém o seguinte código:

  public class Model1 : DbContext { // Your context has been configured to use a 'Model1' connection string from your application's // configuration file (App.config or Web.config). By default, this connection string targets the // 'Skelleton.Models.Model1' database on your LocalDb instance. // // If you wish to target a different database and/or database provider, modify the 'Model1' // connection string in the application configuration file. public Model1() : base("name=Model1") { } // Add a DbSet for each entity type that you want to include in your model. For more information // on configuring and using a Code First model, see http://go.microsoft.com/fwlink/?LinkId=390109. // public virtual DbSet MyEntities { get; set; } } 

insira a descrição da imagem aqui

b) Agora, você decidiu que o nome que acabou de escrever é simplesmente ruim, então você o altera para AppContext

Seu código agora é assim:

  public class AppContext : DbContext { // Your context has been configured to use a 'AppContext' connection string from your application's // configuration file (App.config or Web.config). By default, this connection string targets the // 'Skelleton.Models.AppContext' database on your LocalDb instance. // // If you wish to target a different database and/or database provider, modify the 'AppContext' // connection string in the application configuration file. public AppContext() : base("name=AppContext") { } // Add a DbSet for each entity type that you want to include in your model. For more information // on configuring and using a Code First model, see http://go.microsoft.com/fwlink/?LinkId=390109. // public virtual DbSet MyEntities { get; set; } } 

insira a descrição da imagem aqui

Então, você tenta Scaffold as operações CRUD (criar, ler, atualizar, excluir) com vistas e ele falha!

insira a descrição da imagem aqui

Por que é que?

Bem, se formos ao arquivo web.config, podemos ver a seguinte string:

   

(Esta linha é geralmente abaixo de )

insira a descrição da imagem aqui E aí é onde está o problema. Você precisa mudar Model1 para o nome que você deu para fora!

Nesse caso, ele deve dizer "AppContext" em vez de "Model1"

E onde diz:

 initial catalog=Skelleton.Models.Model1; 

Verifique se:

  1. É o nome do arquivo .cs que tem a class

  2. O namespace (ou a série de nomes (separados por pontos) que vem antes do nome da sua class) é o correto. É importante notar que você não acrescenta ao final a extensão ".cs"; apenas o nome do seu arquivo.

Deve ficar assim: insira a descrição da imagem aqui

Como mudei o nome da class, interna e externamente (dentro dela e do nome do arquivo), e não mudei sua localização, apenas renomeio para AppContext

Depois disto foi feito. Você pode andar normalmente;)

Espero que isto ajude!

Para mim, eu tinha que garantir que as , e NÃO estivessem usando um atributo configSource .

Eu ainda era capaz de usar os atributos configSource outro lugar, como a tag rewriter .

Eu acho que o problema é devido a má configuração no arquivo web.config.

No meu caso, eu tinha várias seções no web.config, e o problema foi resolvido depois que eu alterei as configurações.

Estou no VS 2013 Update 4 e tenho exatamente o mesmo problema. Isso funciona para mim ao mover a string de conexão do arquivo externo para o web.config. Então eu acho que você poderia tentar certificar-se de não usar o atributo configureSource para connectionString quando o scaffolding.

Meu web.config antes e depois da mudança Antes:

  

Isso pode ser útil para pessoas que não instalaram nenhum pacote nuget de scaffolding em sua solução.

Na verdade eu não tenho mvcscaffolding ou t4scaffolding instalado e recebi a mesma mensagem de erro.

No meu caso, o problema / bug foi causado pela alteração da string de conexão.

Aqui o que eu tinha / passos para reproduzir.

  • Instalado o Visual Studio 2013 Community Edition
  • Projeto MVC criado
  • Código criado primeiro modelo
  • Cadeia de conexão editada para se conectar a um servidor real, assim:

      

Então eu habilitei as migrações via nuget, assim:

  • Ativar migrações
  • Add-Migration InitialCreate
  • Atualizar o database
  • Eu comecei o site e pude registrar um usuário. Todas as tabelas foram criadas corretamente.

Então eu criei um controlador usando a opção scaffolding:

  • clique com o botão direito do mouse em “Controladores”> “Adicionar”> Controlador …> Controlador MVC 5 com visualizações, usando Entity Framework> selecione meu contexto e uma class a ser usada. Funcionou.

Então decidi fazer mais alterações primeiro no código e começar do zero:

  • Eu mudei a string de conexão como segue, para usar o localdb :

      

Então eu continuei:

  • excluiu a pasta de migrações
  • migrações reativadas usando os mesmos comandos acima, no console do nuget
  • começou o site e registrou um usuário
  • verifiquei o mdf db. Todas as tabelas estão lá, então a string de conexão funciona.
  • clique com o botão direito do mouse em “Controladores”> “Adicionar”> Controlador …> Controlador MVC 5 com visualizações, usando o Entity Framework. Selecionou meu contexto e uma class a ser usada. Não funcionou e este erro apareceu:

Ocorreu um erro ao executar o gerador de código selecionado: ‘A exceção foi acionada pelo destino de uma chamada.’

SOLUÇÃO:

Após algumas investigações, o que fiz foi alterar a string de conexão no web.config para a inicial para o “servidor real” (em vez de localdb). Tentei novamente gerar o controlador com visualizações. Funcionou!

Então, parece-me que um problema de string de conexão / bug ou um problema localdb … não pode explicá-lo. Talvez o Visual Studio não goste do que eu fiz, eu tive que manter minha antiga string de conexão …

De qualquer forma, agora quando preciso de scaffolding, apenas mudo a string de conexão para a que funciona. Então, para testar meu site, mudo de volta para o localdb.

Eu fiz o seguinte para resolver este problema:

  1. No Gerenciador de Pacotes, verifique se você tem MVCScffolding ou T4Scaffolding (Core ou pré-lançamento para o vs2013)
  2. Desinstale todos os pacotes que dependem de qualquer um dos MVCScaffolding ou T4Scaffolding
  3. Copie a pasta CodeTemplates na íntegra (não substitua os seus modelos personalizados, mas certifique-se de ter o resto dos arquivos da raiz desta pasta. Entendo que você fez essa parte, pois customizou alguns modelos para saber onde esta pasta está)
  4. Construa seu projeto e feche-o.
  5. Reinicie o Visual Studio no modo de administração
  6. Abra o Console do Gerenciador de Pacotes (não deve haver nenhum erro e você pode ver o PM> sem erros.
  7. Clique com o botão direito do mouse na pasta Controller e escolha Add-> New Scaffolding Item ou Choose Add-> Controller. Ambos devem perguntar qual deles você quer e então escolher o scaffold MVC5 ou o que aparecer na lista.
  8. Você então irá selecionar seus parâmetros se seu controlador precisar escolher DBContext ou repository, etc.

Isso produziu o controlador e visualizações relevantes para mim.

Eu adicionei uma vista parcial personalizada chamada QuickView nessa pasta, no entanto, este procedimento de andaimes não considerou isso e apenas gerou visualizações que estava fazendo por padrão. Não tenho certeza se você precisa adicionar essas exibições personalizadas em um arquivo para dizer ao Scaffolder para gerá-las também.

Para mim, o que funcionou foi garantir que o nó no arquivo web.config fosse o primeiro nó imediatamente após o nó .

Inicialmente, quando eu adicionei o meu connectionStrings , eu realmente o coloquei antes do configSections , o que fez a ferramenta Scaffold quebrar.

Parece que quando o scaffolding é executado e tenta capturar informações de conexão, ele espera que a seção de configuração do nó entityFramework já esteja lá para saber qual provedor de database usar, mas quando eu tinha a cadeia de conexão antes configSections, não sabia para usar o LocalDB (que é o que minha string conn estava usando).

Estou executando o VS 2015RC o último antes do corte final. Não descontar nenhuma das soluções aqui. Minha solução estava sob o gerenciador de pacotes nugget e atualizei meu pacote Microsoft.Aspnet.Mvc 5.2.3 e isso corrigiu meu problema. Espero que ajude alguém usando o VS 2015.

Eu usei Initializer e quando remover / comentar Initializer de construtor myDbContext, trabalho de andaimes bem

 public myDbContext () : base("name=DefaultConnection") { //Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); //Database.Initialize(true); } 

Eu tenho tido esse mesmo problema na atualização 4. Descobri que o problema veio do não ter um nome de seção definido. A correção que eu coloquei entre as tags é a seguinte e todos os erros foram corrigidos:

 

Construa o projeto e tudo deve funcionar. Felicidades!