Meu aplicativo que está sendo portado para o .NET core usará o novo EF Core com SQLite. Desejo criar automaticamente o banco de dados e as estruturas de tabela quando o aplicativo é executado pela primeira vez. De acordo com a documentação do núcleo EF, isso é feito usando comandos manuais
dotnet ef migrations add MyFirstMigration
dotnet ef database update
No entanto, não quero que o usuário final insira esses comandos e prefiro que o aplicativo crie e configure o banco de dados para o primeiro uso. Para EF 6, há funcionalidades como
Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());
Mas no EF Core eles não parecem existir. Não consigo encontrar nenhum exemplo ou documentação sobre algo equivalente para o núcleo EF e isso não é mencionado na lista de recursos ausentes na documentação do núcleo EF. Eu já tenho as classes do modelo configuradas, então eu poderia escrever algum código para inicializar o banco de dados com base nos modelos, mas seria muito mais fácil se o framework fizesse isso automaticamente. Não quero construir automaticamente o modelo ou migrar, apenas criar as estruturas da tabela em um novo banco de dados.
Estou faltando alguma coisa aqui ou a função de criação automática de tabela está faltando no núcleo EF?
fonte
Minha resposta é muito semelhante à de Ricardo, mas sinto que minha abordagem é um pouco mais direta simplesmente porque há tanta coisa acontecendo em sua
using
função que nem tenho certeza de como funciona exatamente em um nível inferior.Portanto, para aqueles que desejam uma solução simples e limpa que crie um banco de dados onde você saiba exatamente o que está acontecendo nos bastidores, isto é para você:
Isso significa basicamente que dentro do
DbContext
que você criou (neste caso, o meu é chamadoTargetsContext
), você pode usar uma instância deDbContext
para garantir que as tabelas definidas com na classe sejam criadas quando Startup.cs for executado em seu aplicativo.fonte
EnsureCreated
ignora totalmente as migrações e apenas cria o esquema para você, você não pode misturar isso com migrações.EnsureCreated
foi projetado para teste ou prototipagem rápida em que você não tem problemas em descartar e recriar o banco de dados a cada vez. Se você estiver usando migrações e quiser que elas sejam aplicadas automaticamente na inicialização do aplicativo, você pode usarcontext.Database.Migrate()
.IHostingEnvironment
agora está obsoleto e a alternativa recomendada éMicrosoft.AspNetCore.Hosting.IWebHostEnvironment
.Se você obtiver o contexto por meio da lista de parâmetros de Configure em Startup.cs, você pode fazer o seguinte:
fonte
Para EF Core 2.0+ eu tive que adotar uma abordagem diferente porque eles mudaram a API. A partir de março de 2019, a Microsoft recomenda que você coloque o código de migração do banco de dados na classe de entrada do aplicativo, mas fora do código de compilação do WebHost.
fonte
Se você não criou migrações, existem 2 opções
1. criar o banco de dados e as tabelas do aplicativo principal:
2. criar as tabelas se o banco de dados já existir:
Graças à resposta do Bubi
fonte
EnsureCreated
ouEnsureDeleted
ouDatabase.Migrate
irá falhar"