我想强调一下,这是。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'.
在服务器'localhost'上使用数据库'db' .
MySql.Data.MySqlClient。MySqlException:表异常__efmigrationhistory '不存在
表的数据库。__efmigrationhistory '不存在' ' '
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%" ]
}
}
临时解决方案通过执行dotnet ef migrations script
,我得到SQL代码,我可以直接在MySQL中执行。在创建迁移表之后,一切正常工作。这是不好的临时解决方案。我仍然想知道启用迁移的"正确"方法是什么。
把Mark G的评论变成答案
一旦__efmigrationhistory表被创建,更新的其余部分应该运行。
CREATE TABLE `__EFMigrationsHistory` ( `MigrationId` nvarchar(150) NOT NULL, `ProductVersion` nvarchar(32) NOT NULL, PRIMARY KEY (`MigrationId`) );
或者,在Package Manager Console中使用以下命令生成您的迁移脚本并手动应用到数据库:
Script-Migration
如果需要生成所有脚本,可以使用以下命令:
Script-Migration -from 0
在使用标准Oracle提供程序时遇到同样的问题。
根据这个问题Dot Net实体框架数据库更新没有在mysql数据库中创建表,它还没有实现迁移功能。
我按照建议切换到SapientGuardian提供商,这似乎是现在最好的方法。
编辑:正如评论中建议的那样,柚子是2018年开始的最佳选择。自从我最初的答案以来,我选择了它而不是其他提供商。
我遇到了同样的问题,OP上下文可能略有不同,但为了完整起见,这里是我的答案。
你可能遇到这个问题的一种方式是:
- 创建迁移并更新数据库,
- 之后,由于某种原因,你删除了你的表(不是数据库),并尝试再次运行update- database命令。
在这种情况下,您将得到OP
报告的错误。在这种情况下,的解决方案是删除完整的数据库。之后,update- database命令运行成功。MySql.Data.MySqlClient。MySqlException:表db。__efmigrationhistory '不存在
我不确定它是否只与mysql有关,但要恢复:
- 如果您删除表,但使用现有的数据库(以前有迁移),update命令将给您一个异常。
- 如果您删除完整的数据库,更新命令将正常运行
我也有同样的问题,只是环境略有不同。
问题是我试图在迁移运行之前使用已经存在的数据库运行迁移。
简言之,Make sure that you DO NOT create the database yourself. Let the migrations do it for you.
来自PHP/Laravel背景,这对我来说不是很明显:)
MacOS上的MySQL服务器如果你对我的环境感兴趣的话
与Oracle MySQL官方提供商有相同的问题。
刚刚添加的软件包:Install-Package SapientGuardian.EntityFrameworkCore.MySql