DbContext.Database.Migrate() 不起作用



我在使用 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/

在本课程中,讲师具有以下代码:

主控制器:

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;}
}

课程.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();
}

作者.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;}
}

书.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 已创建",并且确实创建了包含作者和书籍表的数据库。

现在我做一些更改。我跟着上课。教师进行以下更改:

在上下文中覆盖 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();
}

然后,他向作者模型添加一个新属性:

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",实际上作者表有一个新列:MobileNo。

但是,当我这样做时,不会添加新列,并且__EFMigrationsHistory中不存在任何记录。

谷歌搜索这个问题,我发现当您使用 EnsureCreated(( 创建数据库时,无法对其进行进一步迁移(不知道为什么(。不知道教练是如何做到的。

所以我放下数据库并再次运行程序,这次直接转到 localhost:5001/Home/Migrate。它创建具有空__EFMigrationsHistory且没有作者或书籍表的数据库。

我进一步阅读并发现自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 之前使用 EnsureCreated(( 创建数据库后进行迁移?

尝试安装 dotnet-ef 工具失败,并指出:

软件包dotnet-ef 3.1.0与netcoreapp2.2不兼容 (.NETCoreApp,版本=v2.2(/any.软件包 dotnet-ef 3.1.0 支持: NetcoreApp3.1 (.NETCoreApp,版本=v3.1(/any

这就是我现在所处的位置。不确定如何升级到netcoreapp3.1 网上有关于如何为Visual Studio执行此操作的说明,但没有Visual Studio Code,我正在使用的IDE。

一些帮助将不胜感激,如果不是如何升级到netcoreapp3.1,那么至少如何让DbContext.Database.Migrate((工作(在运行EnsureCreated((或使用Migrate((创建数据库之后(。

如果你打电话给_context。Database.Migrate(( 作为上下文中的第一个注释,将不会执行 OnConfigure 方法。因此,您可以尝试在该行之前执行:

_ = this.ChangeTracker;

最新更新