Depois de atualizar para o ASP.NET Core 2.0, não consigo mais criar migrações.
Estou entendendo
"Ocorreu um erro ao chamar o método 'BuildWebHost' na classe 'Programa'. Continuando sem o provedor de serviços do aplicativo. Erro: Ocorreu um ou mais erros. (Não é possível abrir o banco de dados" ... "solicitado pelo login. O login falhou. Login falhou para o usuário '...' "
e
"Não é possível criar um objeto do tipo 'MyContext'. Adicione uma implementação de 'IDesignTimeDbContextFactory' ao projeto ou consulte https://go.microsoft.com/fwlink/?linkid=851728 para padrões adicionais suportados em tempo de design."
O comando que executei anteriormente era $ dotnet ef migrations add InitialCreate --startup-project "..\Web"
(do projeto / pasta com o DBContext).
String de conexão: "Server=(localdb)\\mssqllocaldb;Database=database;Trusted_Connection=True;MultipleActiveResultSets=true"
Este é meu Program.cs
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
Respostas:
Você pode adicionar uma classe que implemente IDesignTimeDbContextFactory dentro de seu projeto da Web.
Aqui está o código de exemplo:
Em seguida, navegue até seu projeto de banco de dados e execute o seguinte na linha de comando:
recurso
fonte
Não há necessidade
IDesignTimeDbContextFactory
.Corre
add-migration initial -verbose
que irá revelar os detalhes sob
aviso, que é a causa raiz do problema.
No meu caso , o problema era ter
ApplicationRole : IdentityRole<int>
e invocar oservices.AddIdentity<ApplicationUser, IdentityRole>()
que estava causando o erro abaixofonte
Solução 1: (Encontre o problema em 99% dos casos)
Definir projeto de aplicativo da Web como projeto de inicialização
Execute os seguintes comandos com
-verbose
opção.Solução 2:
Renomeie
BuildWebHost()
paraCreateWebHostBuilder()
, porqueEntity Framework Core tools
espere encontrar umCreateHostBuilder
método que configure o host sem executar o aplicativo..NET Core 2.2
.NET Core 3.1
Renomear
BuildWebHost()
paraCreateHostBuilder()
Solução 3:
Certifique-se de que adicionou
Dbcontext
à injeção de dependência:AddDbContext<TContext>
tornará seu tipo DbContextTContext
, e o correspondenteDbContextOptions<TContext>
disponível para injeção no contêiner de serviço. Isso requer a adição de um argumento construtor ao seuDbContext
tipo que aceitaDbContextOptions<TContext>
.Exemplo: In Startup.cs
Código AppDbContext :
fonte
public static IWebHostBuilder BuildWebHost(string[] args)
parapublic static IWebHost BuildWebHost(string[] args)
com o.Build()
agora incluído na funçãoIDesignTimeDbContextFactory
Basta renomear
BuildWebHost()
paraCreateWebHostBuilder()
, porque as migrações usam esse método por padrão.fonte
No meu caso, a causa do problema foram vários projetos de inicialização. Tenho três projetos em minha solução: Mvc, Api e Dal. DbContext e Migrações no projeto Dal.
Eu havia configurado vários projetos de inicialização. Ambos os projetos Mvc e Api estavam em execução quando cliquei em Iniciar. Mas, neste caso, eu estava recebendo esse erro.
Pude adicionar migração com sucesso após definir Mvc como o único projeto de inicialização e selecionar Dal no Console do gerenciador de pacotes.
fonte
No AppContext.cs, além da classe AppContext, adicione outra classe:
Isso resolverá seu segundo problema:
Depois disso, você poderá adicionar a migração Initial e executá-la executando o comando update-database . No entanto, se executar esses comandos quando ainda não houver um banco de dados em seu SqlServer local, você receberá o aviso como o seu primeiro erro: "Um erro
Mas não é um erro porque a migração será criada e pode ser executada. Portanto, ignore este erro pela primeira vez, e depois, como o Db existirá, não acontecerá novamente.
fonte
verifique se você tem a referência
fonte
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
que inclui essa referência. Eu tentei também incluir o acima, mas nenhuma alteração.Você pode tentar essa solução a partir desta discussão , que foi inspirada neste post .
fonte
Algo que realmente me ajudou foi este artigo: https://elanderson.net/2017/09/unable-to-create-an-object-of-type-applicationdbcontext-add-an-implementation-of-idesigntimedbcontextfactory/
A ideia básica é que, na mudança de .net core 1 para 2, toda a inicialização do banco de dados deve ser movida de StartUp.cs para Program.cs. Caso contrário, as tarefas EF tentam executar seus comandos DB ao fazer as tarefas.
"Há uma boa seção nos documentos oficiais de migração ( https://docs.microsoft.com/en-us/ef/core/misc Miscellaneous/1x-2x- upgrade ) intitulada“ Mover código de inicialização do banco de dados ”que eu parecia ter falhou. Portanto, antes de descer qualquer buraco de coelho como eu, certifique-se de que não é isso que está causando a necessidade de adicionar uma implementação de IdesignTimeDbContextFactory. "
fonte
De
https://docs.microsoft.com/en-us/ef/core/misc Miscellaneous/cli/dbcontext-creation
Adicionar fábrica em .Net Core 2.x
fonte
Eu tive esse problema e isso foi resolvido por Set -> Web Application (included Program.cs) Project to -> "Set as Startup Project"
Em seguida, execute -> add-migration initial -verbose
no console do gerenciador de pacotes
Definir como projeto inicial
fonte
Se você quiser evitar essa coisa de IDesignTimeDbContextFactory: Apenas certifique-se de não usar nenhum método Seed em sua inicialização. Eu estava usando um método de semente estática na minha inicialização e estava causando esse erro para mim.
fonte
Anteriormente, você configurava os dados de semente no método Configure em Startup.cs. Agora é recomendado que você use o método Configure apenas para configurar o pipeline de solicitação. O código de inicialização do aplicativo pertence ao método Main.
O método Main refatorado. Adicione as seguintes referências ao Program.cs:
using Microsoft.Extensions.DependencyInjection;
using MyProject.MyDbContextFolder;
fonte
Há um problema com ef semeando db de Startup.Configure in 2.0 ... você ainda pode fazer isso com esta solução alternativa. Testado e funcionou bem
https://garywoodfine.com/how-to-seed-your-ef-core-database/
fonte
No meu caso, tive o problema porque tinha um método chamado SeedData.EnsurePopulated () sendo chamado no meu arquivo Startup.cs .
O trabalho da classe SeedData é adicionar dados iniciais à tabela do banco de dados. Seu código é:
SOLUÇÃO
Antes de fazer a migração, simplesmente comente a chamada da classe SeedData no arquivo Startup.cs.
Isso resolveu meu problema e espero que seu problema também seja resolvido da mesma maneira.
fonte
Eu tive o mesmo problema. Tenho dois projetos na solução. qual
Inicialmente, o projeto de API foi definido como projeto de inicialização.
Mudei o projeto de inicialização para aquele que contém classes de contexto. se estiver usando o Visual Studio, você pode definir um projeto como projeto de inicialização:
fonte
Antes de mais nada, certifique-se de ter configurado seu banco de dados em
Startup.cs
No meu caso, eu estava recebendo este erro porque não especifiquei o seguinte emStartup.cs
fonte
Usando ASP.NET Core 3.1 e EntityFrameWorkCore 3.1.0. Substituindo OnConfiguring da classe de contexto por um construtor sem parâmetros apenas
fonte
Eu estava enfrentando o erro
"Não é possível criar um objeto do tipo 'MyContext'. Adicione uma implementação de 'IDesignTimeDbContextFactory' ao projeto ou consulte https://go.microsoft.com/fwlink/?linkid=851728 para padrões adicionais suportados em tempo de design."
Foi assim que meu problema foi resolvido. Execute o comando abaixo enquanto estiver no diretório da solução
Aqui, Application é meu projeto de inicialização contendo a classe Startup.cs e Infrastructure é meu projeto contendo a classe DbContext.
em seguida, execute a atualização usando a mesma estrutura.
fonte
Tive o mesmo problema porque estava me referindo a old- Microsoft.EntityFrameworkCore.Tools.DotNet
Depois de atualizar para a versão mais recente, foi resolvido
fonte
No arquivo appsettings.json do projeto principal, configurei 'Copiar para o diretório de saída' como "Copiar sempre" e funcionou.
fonte
Amostra de classe de contexto de banco de dados para aplicativos de console principal .net
fonte
Você também pode usar no construtor da classe de inicialização para adicionar o arquivo json (onde está a string de conexão) à configuração. Exemplo:
fonte
Para mim, foi porque mudei o
Output Type
do meu projeto de inicialização deConsole Application
paraClass Library
.Reverter para
Console Application
fazer o truque.fonte
Tive esse problema em uma solução que tem:
Recebo a mensagem "não foi possível criar um objeto ..." quando o projeto Blazor é definido como o projeto de inicialização, mas não se o projeto MVC está definido como o projeto de inicialização.
Isso me intriga, porque no console do gerenciador de pacotes (que é onde estou criando a migração) eu tenho o projeto padrão definido para uma biblioteca de classes C # que realmente contém o contexto do banco de dados, e também estou especificando o contexto do banco de dados em minha chamada para adicionar-migração
add-migration MigrationName -context ContextName
, então parece estranho que o Visual Studio se importe com o projeto de inicialização que está definido no momento.Acho que o motivo é que quando o projeto Blazor é o projeto de inicialização, o PMC está determinando a versão do .NET como Core 3.0 a partir do projeto de inicialização e, em seguida, tentando usar isso para executar as migrações na classe .NET Standard 2.0 biblioteca e encontrando algum tipo de conflito.
Seja qual for a causa, mudar o projeto de inicialização para o projeto MVC que visa o Core 2.2, em vez do projeto Blazor, corrigiu o problema
fonte
Para mim, o problema era que estava executando os comandos de migração dentro do projeto errado. Executar os comandos dentro do projeto que continha o Startup.cs, em vez do projeto que continha o DbContext, me permitiu superar esse problema específico.
fonte
No meu caso, a configuração do projeto StartUp no init ajuda. Você pode fazer isso executando
fonte
Eu tive o mesmo problema. Apenas alterei o ap.jason para application.jason e corrigiu o problema
fonte