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 и работа с миграцией!