web-dev-qa-db-fra.com

EF Core - La table '* .__ EFMigrationsHistory' n'existe pas

Je tiens à souligner qu'il s'agit de .NET Core et que les discussions sur EF 6.0 ne s'appliquent pas à ce problème

J'ai créé mon DbContext et je l'ai ajouté dans DI, mais lorsque je fais dotnet ef database update -v, il ne veut pas créer la table des migrations __EFMigrationsHistory.

Existe-t-il une autre commande que je devrais d'abord faire ou s'agit-il d'un bogue de l'adaptateur EF Core MySQL?

MainDbContext

using Microsoft.EntityFrameworkCore;
using MySQL.Data.EntityFrameworkCore.Extensions;
using Web.Models;

namespace Web.Infrastructure
{
    public class MainDbContext : DbContext
    {
        public DbSet<User> Users { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySQL("connection-string-here");
            base.OnConfiguring(optionsBuilder);
        }
    }
}

Erreur

Trouver des classes DbContext ...

Utilisation du contexte 'MainDbContext'.

Utilisation de la base de données 'db' sur le serveur 'localhost'.

MySql.Data.MySqlClient.MySqlException: la table 'db .__ EFMigrationsHistory' n'existe pas

Le tableau 'db .__' EFMigrationsHistory 'n'existe pas `` `

project.json

{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.1",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Mvc": "1.0.1",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.AspNetCore.Routing": "1.0.1",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0",
    "BundlerMinifier.Core": "2.2.301",
    "WebMarkupMin.AspNetCore1": "2.2.1",
    "MySql.Data.EntityFrameworkCore": "7.0.6-IR31",
    "Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final"
  },
  "tools": {
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
  },
  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  },
  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },
  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },
  "publishOptions": {
    "include": [
      "wwwroot",
      "**/*.cshtml",
      "appsettings.json",
      "web.config"
    ]
  },
  "scripts": {
    "prepublish": [ "bower install", "dotnet bundle" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

Solution temporaire

En exécutant dotnet ef migrations script, je reçois du code SQL que je peux exécuter directement dans MySQL. Ensuite, la table des migrations est créée et tout fonctionne normalement. C'est une solution temporaire qui est mauvaise. Je me demande encore quelle est la "bonne" façon d'activer les migrations.

17
stan

Rencontré le même problème lors de l'utilisation du fournisseur Oracle standard.

Selon cette question La mise à jour de la base de données Dot Net Entity Framework ne crée pas de tables dans la base de données mysql la fonctionnalité de migration n'a pas encore été implémentée.

J'ai suivi les suggestions du fournisseur SapientGuardian et cela semble être la meilleure voie à suivre maintenant.

Edit: comme suggéré dans les commentaires, Pomelo est la meilleure option à partir de 2018. Je l’ai choisie par rapport à d’autres fournisseurs depuis ma réponse initiale.

13
Peuczynski

Transformer le commentaire de Mark G en réponse.

Une fois la table __EFMigrationsHistory créée, le reste de la mise à jour doit s'exécuter.

CREATE TABLE `__EFMigrationsHistory` ( `MigrationId` nvarchar(150) NOT NULL, `ProductVersion` nvarchar(32) NOT NULL, PRIMARY KEY (`MigrationId`) );

Vous pouvez également générer le script de votre/vos migration (s) et l'appliquer à la base de données manuellement à l'aide de cette commande dans la console Package Manager:

Script-Migration

Si vous devez générer tous les scripts, vous pouvez utiliser cette commande:

Script-Migration -from 0
22
Derrick

Je rencontre le même problème, le contexte OP peut être légèrement différent, mais voici ma réponse par souci d’exhaustivité. 

L'un des moyens par lesquels vous pouvez rencontrer ce problème est si:

  • Vous créez une migration et mettez à jour la base de données, 
  • Plus tard, pour une raison quelconque, vous supprimez vos tables (pas la base de données) et essayez d’exécuter à nouveau la commande update-databse.

Dans ce cas, vous obtiendrez l'erreur signalée par OP 

MySql.Data.MySqlClient.MySqlException: Table 'db .__ EFMigrationsHistory' n'existe pas

La solution dans ce cas, consiste à supprimer la base de données complète . Après cela, la commande update-databse s'exécute avec succès. 

Je ne sais pas si c'est lié à mysql uniquement, mais pour résumer:

  • Si vous supprimez les tables mais utilisez une base de données existante (ayant déjà migré), la commande de mise à jour vous donnera une exception.
  • Si vous supprimez la base de données complète , la commande de mise à jour fonctionnera parfaitement.
5
Ferox

Avait le même problème avec le fournisseur officiel Oracle MySQL.

Le paquet vient d'être ajouté: SapientGuardian.EntityFrameworkCore.MySql Install.

0
Daimonion