O termo 'scaffold-dbcontext' não é reconhecido como o nome de um cmdlet, função, arquivo de script ou programa operável

87

Ao tentar scaffold com asp.net core, este comando

scaffold-dbcontext "Fonte de dados = (local); Catálogo inicial = MyDb; Segurança integrada = True;" Microsoft.EntityFrameworkCore.sqlserver -outputdir Modelos

Dá esse erro.

scaffold-dbcontext: O termo 'scaffold-dbcontext' não é reconhecido como o nome de um cmdlet, função, arquivo de script ou programa operável. Verifique a grafia do nome ou, se um caminho foi incluído, verifique se o caminho está correto e tente novamente. Na linha: 1 char: 1 + scaffold-dbcontext "Fonte de dados = (local); Catálogo inicial = MyDB; Em ... + ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: ObjectNotFound: (scaffold-dbcontext: String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException

Tentei a solução aqui , mas não funciona para mim.

Alguma ideia de qual poderia ser a causa / cura?

simon831
fonte
Certifique-se de que entityframework.tools está na seção de ferramentas do seu project.json.
Tim Scriv

Respostas:

216

Para mim, aparentemente, funcionou, uma vez que também executei no console do Gerenciador de Pacotes:

 Install-Package Microsoft.EntityFrameworkCore.Tools 

Certifique-se também:

  • Para ter outras dependências (por exemplo Microsoft.EntityFrameworkCore, Microsoft.EntityFrameworkCore.SqlServer, Microsoft.EntityFrameworkCore.SqlServer.Design ...) referenciadas dependendo de suas necessidades.

  • Para selecionar o conjunto certo como alvo para seus comandos no canto superior direito do console PM (frequentemente sou enganado por esquecê-lo ...)

Outro problema que encontrei: com o dbcontext localizado em uma biblioteca de classes separada, encontrei o seguinte erro:

Não foi possível localizar o assembly do provedor com o nome Microsoft.EntityFrameworkCore.SqlServer. Certifique-se de que o nome especificado esteja correto e seja referenciado pelo projeto.

O que eu consegui consertar definindo minha biblioteca de classe como projeto de inicialização no VS (não pergunte por que, pois parece sem sentido, mas funcionou).

Edição tardia, há algo mais a saber: você não pode executar o Scaffold-DbContext em uma biblioteca de classes direcionada apenas para .Net Standard, você também deve habilitar o netcoreapp nele, ou o Scaffold-DbContext reclamará. Para oferecer suporte a ambos os destinos, edite o csproj para colocar: <TargetFrameworks>netcoreapp2.2;netstandard2.0</TargetFrameworks> Em vez de<TargetFramework> seção.

Depois de tudo isso, você será capaz de executar sua Scaffold-DbContextlinha de comando com argumentos adequados e string de conexão.

AFract
fonte
2
Obrigado por isso. Sua solução ainda funciona para VS2019 usando .net core 2.2
PaulC
Pena que a Microsoft não melhorou isso nos últimos meses. Eu não esperava que minha resposta fosse tão útil e por enquanto alguma parte dela parece ser uma solução alternativa complicada para algum comportamento estranho de IDE ...
AFract
Encontrei o erro: Não é possível encontrar o assembly do provedor com o nome Microsoft.EntityFrameworkCore.SqlServer. Certifique-se de que o nome especificado esteja correto e seja referenciado pelo projeto. Também tive que executar: Install-Package Microsoft.EntityFrameworkCore.SqlServer
Ahmed Faizan
@AhmedFaizan na verdade é um dos exemplos de pacotes mencionados no post. Que bom que foi útil
AFract de
1
Requerido pelo NET Core 3.1, mas não pela documentação oficial do mysql, ele deve ser instalado para fazer o scaffold de um banco de dados mysql primeiro com o mysql EF core. Obrigado, claro.
Leandro
16
  1. Certifique-se de que ele esteja disponível em seu arquivo project.json "Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-preview3-final".

insira a descrição da imagem aqui

  1. Execute o comando no console do gerenciador de pacotes

insira a descrição da imagem aqui

isso é tudo que vai funcionar

Devanathan.S
fonte
9
na verdade, eu conserto isso instalando o pacote nuget: Install-Package Microsoft.EntityFrameworkCore.Tools
kepung
@kepung - Tive que fazer isso após uma atualização recente do VS2017. Ímpar. Obrigado pelo seu comentário, pois resolveu o problema para mim.
KSwift87 de
10

Certifique-se de executar o VS como administrador e de ter instalado os seguintes pacotes:

  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.SqlServer.Design
  • Microsoft.EntityFrameworkCore.Tools
Moji
fonte
1
Para o meu problema semelhante, não precisei instalar Microsoft.EntityFrameworkCore.SqlServer.Design e instalei o resto e ele funciona corretamente.
MinaMRM
@MinaMRM obrigado. funcionou!!
The Godfather
8

Tive o mesmo problema. No meu caso, faltavam algumas dependências, então certifique-se de que você tenha a seguinte:

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Tools

insira a descrição da imagem aqui

Espero que isso ajude. :)

eldinT
fonte
Tenho três desses, mas ainda recebo o erro "Scafford-DbContext não reconhecido". Tentei adicionar Microsoft.EntityFrameworkCore.SqlServer.Design, mas não ajudou.
Rod
1

Se você estiver usando .NetCore 2.2, o comando abaixo funciona perfeitamente para mim no prompt de comando ou no Git Bash. Certifique-se de estar diretamente na pasta do projeto antes de executar o comando.

Por exemplo C: \ App \ ProjectName:

 dotnet ef dbcontext scaffold "Server=.\;Database=Databasename;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Model
Auguste
fonte
1

Eu tinha instalado Microsoft.EntityFrameworkCore.Tools do NuGet Package Manager e estava visível nos pacotes instalados. Mas continuei recebendo esse erro.

Reiniciar o Visual Studio (2019 / versão 16.4.4) corrigiu para mim.

joym8
fonte
1

Scaffoldo comando é parte do dbcontextcomando no EF. Abaixo estão os detalhes para o sucesso scaffold:

insira a descrição da imagem aqui

Referências de pacote necessárias:

<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.0.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.0.0"/>

Portanto, nosso comando scaffold deve ser semelhante a:

dotnet ef dbcontext scaffold "Server=localhost\SQLEXPRESS;Database=MyDatabase;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o OutputDirectory

Seu Server valor pode ser diferente de acordo com o nome do servidor Db. Substitua MyDatabasepelo nome do seu banco de dados como mastere OutputDirectorypelo local em que deseja que suas classes de scaffold recém-criadas como Modelspasta.

Prasad Kaiche
fonte
1

Certifique-se de estar usando o console correto, o "Console do gerenciador de pacotes". Há também um console "Terminal" que é muito semelhante, mas não funciona para este comando. O console do gerenciador de pacotes pode ser encontrado em Exibir -> Outras janelas (a partir do Visual Studio 2019, versão 16.6.5)

FloverOwe
fonte
-1

Encontrei outra causa para esse erro recentemente: o próprio NuGet estava desatualizado.

Atualizar o NuGet resolveu o problema.

Se a resposta de Devanathan não funcionar para você, verifique se o NuGet está atualizado.

Brian Swift
fonte
-2

Para mim ... ao copiar e colar o comando dos documentos da Microsoft, por algum motivo, um espaçamento extra foi adicionado ao redor dos hifens.

A remoção dos hifens corrigiu:

errado:

Scaffold - DbContext "Server=(localdb)\mssqllocaldb;Database=myDbName;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer - OutputDir Models

Boa:

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=myDbName;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

Os documentos também dizem que se você receber esse erro, tente reiniciar o Visual Studio.

https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db

Andrew
fonte