web-dev-qa-db-fra.com

créer automatiquement une base de données dans Entity Framework Core

Mon application qui est en cours de transfert sur le noyau .NET utilisera le nouvel EF Core avec SQLite. Je souhaite créer automatiquement les structures de base de données et de table lors de la première exécution de l'application. Selon la documentation de base EF, cela se fait à l'aide de commandes manuelles

dotnet ef migrations add MyFirstMigration

dotnet ef database update

Cependant, je ne veux pas que l'utilisateur final entre ces commandes et préférerais que l'application crée et configure la base de données pour la première utilisation. Pour EF 6, il existe des fonctionnalités telles que

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

Mais dans EF Core, ils ne semblent pas exister. Je ne trouve aucun exemple ni documentation sur quelque chose d'équivalent pour EF core et cela ne figure pas dans la liste des fonctionnalités manquantes dans la documentation de base EF. J'ai déjà configuré les classes de modèles afin de pouvoir écrire du code pour initialiser la base de données à partir des modèles, mais il serait beaucoup plus facile si le cadre le faisait automatiquement. Je ne veux pas construire ou migrer le modèle automatiquement, créez simplement les structures de table sur une nouvelle base de données.

Me manque-t-il quelque chose ici ou manque-t-il une fonction de création automatique de tableau dans EF Core?

65
deandob

Si vous avez créé les migrations, vous pouvez les exécuter dans le fichier Startup.cs comme suit.

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
      using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
      {
            var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
            context.Database.Migrate();
      }

      ...

Cela créera la base de données et les tables en utilisant vos migrations ajoutées.

Si vous n'utilisez pas les migrations Entity Framework et que vous avez simplement besoin que votre modèle DbContext soit créé exactement tel qu'il est dans votre classe de contexte à la première exécution, vous pouvez utiliser:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
      using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
      {
            var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
            context.Database.EnsureCreated();
      }

      ...

Au lieu.

Si vous devez supprimer votre base de données avant de vous assurer qu'elle est créée, appelez:

            context.Database.EnsureDeleted();

Juste avant d'appeler EnsureCreated ()

Adapté de: http://docs.identityserver.io/en/latest/quickstarts/7_entity_framework.html?highlight=entity

95
Ricardo Fontana

Ma réponse est très similaire à celle de Ricardo, mais j'estime que mon approche est un peu plus simple simplement parce qu'il y a tellement de choses dans sa fonction using que je ne suis même pas sûr de savoir comment cela fonctionne exactement à un niveau inférieur. niveau.

Donc, pour ceux qui veulent une solution simple et propre qui crée une base de données pour vous où vous savez exactement ce qui se passe sous le capot, ceci est pour vous:

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

Cela signifie quasiment qu'au sein de la DbContext que vous avez créée (dans ce cas, la mienne s'appelle TargetsContext), vous pouvez utiliser une instance de la DbContext pour vous assurer que les tables définies avec la classe est créée lorsque Startup.cs est exécuté dans votre application.

25
susieloo_

Si vous obtenez le contexte via la liste de paramètres de Configure dans Startup.cs, procédez comme suit:

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

Si vous n'avez pas créé de migrations, il y a 2 options

1.créez la base de données et les tables à partir de l'application Main:

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

2.créez les tables si la base de données existe déjà:

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

Merci à Bubi réponse

6
Nathan Alard

Pour EF Core 2.0+, j'ai dû adopter une approche différente, car ils ont changé l'API. À partir de mars 2019 Microsoft recommande , vous insérez le code de migration de votre base de données dans la classe d'entrée de votre application, mais en dehors du code de génération 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>();
}
3
Paul Stegler