EF Core - Таблица '*.__ EFMigrationsHistory' не существует

Я хочу подчеркнуть, что это.NET Core, и нити об EF 6.0 не относятся к этой проблеме

Я создал свой DbContext и добавил его в DI, однако, когда я делаю dotnet ef database update -v он не хочет создавать таблицу миграции __EFMigrationsHistory.

Есть ли какая-то другая команда, которую я должен сделать в первую очередь, или это ошибка адаптера 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);
        }
    }
}

ошибка

Поиск классов DbContext...

Использование контекста "MainDbContext".

Использование базы данных "db" на сервере "localhost".

MySql.Data.MySqlClient.MySqlException: таблица 'db.__ EFMigrationsHistory' не существует

Таблица 'db.__ EFMigrationsHistory' не существует '' '

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%" ]
  }
}

Решение Temp

Выполняя dotnet ef migrations script я получаю SQL-код, который я могу выполнить непосредственно в MySQL. После этого создается таблица миграции, и все работает нормально. Это временное решение, которое плохо. Мне все еще интересно, что такое "правильный" способ включения миграции.

Ответы

Ответ 1

Обнаружена та же проблема при использовании стандартного поставщика Oracle.

Согласно этому вопросу обновление базы данных Dot Net Entity Framework не создает таблицы в базе данных mysql, у нее еще нет функции миграции.

Я следил за предложениями, которые переключились на поставщика SapientGuardian, и, похоже, это лучший способ пойти сейчас.

Изменение: как предложено в комментариях Помело - лучший вариант с начала 2018 года. Я выбрал его по сравнению с другими провайдерами с момента моего первоначального ответа.

Ответ 2

Поверните комментарий Марка G в ответ.

Когда таблица __EFMigrationsHistory была создана, остальная часть обновления должна работать.

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

В качестве альтернативы, сгенерируйте сценарий ваших миграций и примените к базе данных вручную, используя эту команду в консоли диспетчера пакетов:

Script-Migration

Если вам нужно сгенерировать все сценарии, вы можете использовать эту команду:

Script-Migration -from 0

Ответ 3

Я сталкиваюсь с той же проблемой, контекст OP может немного отличаться, но вот мой ответ ради полноты.

Одним из способов решения этой проблемы является:

  • Вы создаете миграцию и обновляете базу данных,
  • Позже по какой-то причине вы отбрасываете свои таблицы (а не базу данных) и пытаетесь снова запустить команду update-databse.

В этом случае вы получите сообщение об ошибке, сообщенное OP

MySql.Data.MySqlClient.MySqlException: таблица 'db.__ EFMigrationsHistory' не существует

Решение в этом случае состоит в том, чтобы удалить полную базу данных. После этого команда update-databse выполняется успешно.

Я не уверен, что это связано только с mysql, но для возобновления:

  • Если вы отбрасываете таблицы, но используете существующую базу данных (с предыдущими миграциями), команда update выдаст вам исключение.
  • Если вы отбросите всю базу данных, команда обновления будет работать отлично.

Ответ 4

Имела ту же проблему с официальным поставщиком Oracle MySQL.

Просто добавленный пакет: Install-Package SapientGuardian.EntityFrameworkCore.MySql и работа с миграцией!