DbContext.Database.Migrate()不起作用

时间:2019-12-07 05:43:58

标签: .net-core entity-framework-core ef-migrations

我无法使用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()创建数据库之后)。 )。

0 个答案:

没有答案