c# - with - using sqlite.net core




criar banco de dados automaticamente no Entity Framework Core (4)

Meu aplicativo que está sendo portado para o .NET core usará o novo EF Core com SQLite. Desejo criar automaticamente as estruturas de banco de dados e tabela quando o aplicativo é executado pela primeira vez. De acordo com a documentação principal da 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 prefira que o aplicativo crie e configure o banco de dados para o primeiro uso. Para o EF 6, há funcionalidades como

Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());

Mas no EF Core, eles parecem não existir. Não consigo encontrar nenhum exemplo ou documentação sobre algo equivalente ao núcleo EF e isso não é mencionado na lista de recursos ausentes na documentação do núcleo EF. Já tenho as classes de modelo configuradas para poder escrever algum código para inicializar o banco de dados com base nos modelos, mas seria mais fácil se a estrutura fizesse isso automaticamente. Não quero criar automaticamente o modelo ou migrar, basta 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á ausente no núcleo EF?


Minha resposta é muito semelhante à resposta de Ricardo, mas sinto que minha abordagem é um pouco mais direta, simplesmente porque há tanta coisa acontecendo na função de using dele que nem tenho certeza de como exatamente ela funciona em um nível mais baixo.

Portanto, para aqueles que desejam uma solução simples e limpa que crie um banco de dados para você, onde você sabe exatamente o que está acontecendo sob o capô, isso é para você:

public Startup(IHostingEnvironment env)
{
    using (var client = new TargetsContext())
    {
        client.Database.EnsureCreated();
    }
}

Isso significa que, dentro do DbContext que você criou (nesse caso, o meu é chamado TargetsContext ), você pode usar uma instância do DbContext para garantir que as tabelas definidas na classe sejam criadas quando o Startup.cs for executado no seu inscrição.


Para o EF Core 2.0+, tive que adotar uma abordagem diferente porque eles mudaram a API. Desde 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 criação do WebHost.

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateWebHostBuilder(args).Build();
        using (var serviceScope = host.Services.CreateScope())
        {
            var context = serviceScope.ServiceProvider.GetRequiredService<PersonContext>();
            context.Database.Migrate();
        }
        host.Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

Se você não criou migrações, existem 2 opções

1. crie o banco de dados e as tabelas no aplicativo Principal:

var context = services.GetRequiredService<YourRepository>();
context.Database.EnsureCreated();

2. crie as tabelas se o banco de dados já existir:

var context = services.GetRequiredService<YourRepository>();
context.Database.EnsureCreated();
RelationalDatabaseCreator databaseCreator =
(RelationalDatabaseCreator)context.Database.GetService<IDatabaseCreator>();
databaseCreator.CreateTables();

Graças à answer de Bubi


Se você obtiver o contexto através da lista de parâmetros do Configure no Startup.cs, poderá fazer o seguinte:

public void Configure(IApplicationBuilder app, IHostingEnvironment env,  LoggerFactory loggerFactory,
    ApplicationDbContext context)
 {
      context.Database.Migrate();
      ...




.net-core