EntityFramework Core自动迁移

问题描述 投票:33回答:8

asp.net核心项目中的Entity Framework core code first中是否有任何代码可以执行自动迁移?

我通过添加简单地在MVC4 / 5中完成

Database.SetInitializer(new MigrateDatabaseToLatestVersion<AppDbContext, MyProject.Migrations.Configuration>());
public Configuration() {
          AutomaticMigrationsEnabled = true;
        }

这样可以节省更改实体时的时间

entity-framework asp.net-core entity-framework-core
8个回答
29
投票

您可以在context.Database.Migrate()中呼叫Startup.cs

例如:

using (var context = new MyContext(...))
{
    context.Database.Migrate();
}

31
投票

EF核心不支持 automatic migrations。因此您必须手动执行。

从自动迁移功能来看,我们并不经验表明代码库正计划在EF Core中实施迁移是一种更易于管理的方法。

您可以在这里阅读全文:Not to implement Automatic Migrations


16
投票

这是他们在IdentityServer4 http://identityserver.io中执行的方法

public void ConfigureServices(IServiceCollection services)
{
    var connectionString = Configuration.GetConnectionString("DefaultConnection");
    var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;

    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(connectionString));
    ...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    // this will do the initial DB population
    InitializeDatabase(app);
}

private void InitializeDatabase(IApplicationBuilder app)
{
    using (var scope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
    {
        scope.ServiceProvider.GetRequiredService<ApplicationDbContext>().Database.Migrate();
        scope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
        ...
    }
}

15
投票

EF核心不支持自动迁移。迁移是必须动手的。要自动应用所有现有的手工迁移,需要在Program类中添加以下代码:

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateWebHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<MyDbContext>();
                context.Database.Migrate(); // apply all migrations
                SeedData.Initialize(services); // Insert default data
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred seeding the DB.");
            }
        }

        host.Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

4
投票

按照Microsoft的文档

https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro

如果使用依赖项注入,首先,需要设置静态类Data / DbInitializer.cs并添加以下代码:

public static class DbInitializer
{
    public static void Initialize(ApplicationDbContext context)
    {
        context.Database.Migrate();

        // Add Seed Data...
    }
}

注意,这也是您可以添加种子数据的地方。

下一步,在您的Program.cs文件中,添加以下代码

public static void Main(string[] args)
    {
        var host = BuildWebHost(args);

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
            try
            {
                var environment = services.GetRequiredService<IHostingEnvironment>();

                if (!environment.IsDevelopment())
                {
                    var context = services.GetRequiredService<ApplicationDbContext>();
                    DbInitializer.Initialize(context);
                }
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred while seeding the database.");
            }
        }

        host.Run();
    }

就我而言,我正在检查环境以确保我正在开发中,以便可以控制迁移/更新。但是,在生产中,我希望它们能够自动进行连续集成。正如其他人提到的那样,这可能不是最佳做法,但在小型项目中效果很好。


3
投票

我正在使用的自动迁移代码Asp Net Core 2.0.7。

    // startup.cs
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // configure app

        SeedData.Initialize(app.ApplicationServices);
    }       

    // dbInitializer.cs
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var serviceScope = serviceProvider.CreateScope())
            {
                var context = serviceScope.ServiceProvider.GetService<ApplicationDbContext>();

                // auto migration
                context.Database.Migrate();

                // Seed the database.
                InitializeUserAndRoles(context);
            }
        }

        private static void InitializeUserAndRoles(ApplicationDbContext context)
        {
            // init user and roles  
        }
    }

1
投票

您可以在数据库上下文构造函数中调用Database.Migrate()


0
投票

我最好的建议是不要使用自动迁移。总是最好手动添加迁移,并且避免批量迁移,并坚持使用手动迁移的最佳做法

自动迁移不是魔术工具,在某些情况下,您可能想对迁移添加一些其他更改。您只能通过手动迁移来完成。

要启用迁移,请在程序包管理器控制台中键入“ enable-migrations”

这样,您将完全控制升级或降级数据库的权限,并且易于跟踪迁移。

仅在包管理器控制台中只需三个简单步骤。

1)add-migrations [您的迁移的名称]

2)为更改生成了迁移,您可以查看它们,并且还可以对其进行更改

3)更新数据库,您的迁移现已完成。

减轻迁移的痛苦!

© www.soinside.com 2019 - 2024. All rights reserved.