EntityFramework核心自动迁移

Lap*_*mir 32 entity-framework entity-framework-core asp.net-core

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

我只是在MVC4/5中添加

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

这节省了实体更改的时间

Sam*_*ath 28

EF核心不支持 automatic migrations.所以你必须手动完成.

从自动迁移作为一项功能的角度来看,我们不打算在EF Core中实现它,因为经验表明基于代码的迁移是一种更易于管理的方法.

您可以在此处阅读完整的故事:不要实现自动迁移

  • 尽管如此,在我工作的所有项目中,它对我来说都非常有效,从而导致极其低调的维护,特别是在项目建设期间.遗憾的是它消失了,但我可以想象有时候开销不值得. (6认同)

Fra*_*oom 25

你可以打电话给context.Database.Migrate()Startup.cs

例如:

using (var context = new MyContext(...))
{
    context.Database.Migrate();
}
Run Code Online (Sandbox Code Playgroud)

  • @FrankOdoom答案是错误的,除非添加了单独的迁移步骤,否则迁移将不起作用,并且不等同于“ AutomaticMigrationsEnabled”。 (4认同)
  • MyContext 看起来像这样,我不知道在选项 public ApplicationDbContext(DbContextOptions&lt;ApplicationDbContext&gt; options) 中放什么: base(options) { } (2认同)

小智 15

这是他们在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();
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 他们不再这样做了。我检查了他们的源代码。 (2认同)

Men*_*tor 13

EF Core不支持自动迁移.迁移是必要的创造手.要自动应用所有现有的手工迁移,需要在DbContext中添加以下代码:

public sealed class MyDbContext : DbContext
{
  private static readonly bool[] _migrated = { false };

  public MyDbContext( DbContextOptions<MyDbContext> options ) : base( options )
  {
    if ( !_migrated[0] )
      lock ( _migrated )
        if ( !_migrated[0] )
        {
          Database.Migrate(); // apply all migrations
          _migrated[0] = true;
        }
  }
}
Run Code Online (Sandbox Code Playgroud)

它不优雅,但有效.

EFCore 2.1的更新:

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>();
}
Run Code Online (Sandbox Code Playgroud)

  • 为了有一个锁定字段和快速检查而不拆箱. (6认同)

小智 6

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


小智 5

遵循微软的文档

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...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

接下来,在您的 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();
    }
Run Code Online (Sandbox Code Playgroud)

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


dev*_*ria 5

我的工作自动迁移代码 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  
        }
    }
Run Code Online (Sandbox Code Playgroud)