我无法使用DbContext.Database.Migrate()在Entity Framework Core 3.1.0中迁移SQL Server数据库。
我正在遵循Udemy课程:
https://www.udemy.com/course/learn-entity-framework-core-2-efc2-using-aspnet-core/
在此课程中,讲师具有以下代码:
HomeController:
public class HomeController : Controller
{
private Context _context;
public HomeController(Context context) {
_context = context;
}
public string Index() {
_context.Database.EnsureCreated();
return "DB Created";
}
public string Migrate() {
_context.Database.Migrate();
return "DB Migrated";
}
}
上下文:
public class Context: DbContext {
public Context(DbContextOptions<Context> options) : base(options) {
}
public DbSet<Author> Author {get;set;}
public DbSet<Book> Book {get;set;}
}
Program.cs:
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
Author.cs:
public class Author {
public int AuthorId {get;set;}
public string Name {get;set;}
public string MailId {get;set;}
public ICollection<Book> Books {get;set;}
}
Book.cs:
public class Book {
public int BookId {get;set;}
public string Title {get;set;}
public string Description {get;set;}
public int AuthorId {get;set;}
public double Price {get;set;}
public Author Author {get;set;}
}
运行此命令并转到localhost:5001 / Home时,它会打印出“ DB Created”(DB已创建),并且确实是在数据库中创建了Author和Book表。
现在,我进行一些更改。我会继续学习。讲师进行以下更改:
在上下文中覆盖OnConfiguring(...):
public class Context: DbContext {
public Context(DbContextOptions<Context> options) : base(options) {
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
if (!optionsBuilder.IsConfigured) {
optionsBuilder.UseSqlServer(...);
}
}
public DbSet<Author> Author {get;set;}
public DbSet<Book> Book {get;set;}
}
然后他在Program.cs中更改BuildWebHost(...):
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseDefaultServiceProvider(options => options.ValidateScopes = false)
.UseStartup<Startup>()
.Build();
}
然后,他向Author模型添加一个新属性:
public class Author {
public int AuthorId {get;set;}
public string Name {get;set;}
public string MailId {get;set;}
public string MobileNo {get;set;}
public ICollection<Book> Books {get;set;}
}
他运行该程序,转到localhost:5001 / Home / Migrate,并显示“ DB Migrated”,并且Author表确实有一个新列:MobileNo。
但是,当我这样做时,不会添加新列,并且__EFMigrationsHistory中没有记录。
谷歌搜索这个问题,我发现当您使用确保创建数据库()时,无法对其进行进一步的迁移(不确定原因)。不知道讲师是如何做到的。
因此,我删除数据库并再次运行程序,这次直接转到localhost:5001 / Home / Migrate。它使用空的__EFMigrationsHistory创建数据库,而没有Author或Book表。
我进一步阅读,发现自EFCore 3.0起:
从3.0开始,dotnet ef命令行工具也不再 包含在.NET Core SDK中。在执行EF Core之前 迁移或脚手架命令,则必须安装此软件包 作为全局或局部工具。要安装我们的最终版本 3.0.0工具作为全局工具,请使用以下命令:
dotnet工具安装--global dotnet-ef --version 3.0.0
现在,我不执行迁移命令,但是很明显,自从本课程中使用的2.0版本以来,迁移的工作方式已经进行了一些更改(是否可以使用以下命令创建数据库:确保在3.0之前版本?)。
尝试安装dotnet-ef工具失败:
软件包dotnet-ef 3.1.0与netcoreapp2.2不兼容 (.NETCoreApp,Version = v2.2)/任何。软件包dotnet-ef 3.1.0支持: netcoreapp3.1(.NETCoreApp,Version = v3.1)/任何
这就是我现在的位置。不确定如何升级到netcoreapp3.1。有关如何针对Visual Studio而不是我正在使用的IDE的Visual Studio Code进行在线说明,
一些帮助将不胜感激,如果不是如何升级到netcoreapp3.1的话,那么至少是如何使DbContext.Database.Migrate()起作用(在运行sureCreated()或使用Migrate()创建数据库之后)。 )。