Entity Framework, Automatic apply Migrations

后端 未结 4 532
后悔当初
后悔当初 2020-12-08 05:26

I am using Entity Framework Code First approach with AutomaticMigrationsEnabled = true:

Database.SetInitializer(new MigrateDatabaseToLatestVersi         


        
相关标签:
4条回答
  • 2020-12-08 06:00

    Microsoft addresses migrations at runtime, here: https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=vs#apply-migrations-at-runtime

    For example, you can do this in Program.cs: (tested working in .NET 5.0 preview)

    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
    
        MigrateDatabase(host);
    
        host.Run();
    }
    
    private static void MigrateDatabase(IHost host)
    {
        using var scope = host.Services.CreateScope();
        var services = scope.ServiceProvider;
    
        try
        {
            var context = services.GetRequiredService<ApplicationDbContext>();
            context.Database.Migrate();
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred creating the DB.");
        }
    }
    
    0 讨论(0)
  • 2020-12-08 06:08

    Finally, I found a solution to my problem. I call this method in each application start :

    public void InitializeDatabase(DataAccessManager context)
    {
        if (!context.Database.Exists() || !context.Database.CompatibleWithModel(false))
        {
            var configuration = new DbMigrationsConfiguration();
            var migrator = new DbMigrator(configuration);
            migrator.Configuration.TargetDatabase = new DbConnectionInfo(context.Database.Connection.ConnectionString, "System.Data.SqlClient");
            var migrations = migrator.GetPendingMigrations();
            if (migrations.Any())
            {
                var scriptor = new MigratorScriptingDecorator(migrator);
                var script = scriptor.ScriptUpdate(null, migrations.Last());
    
                if (!string.IsNullOrEmpty(script))
                {
                    context.Database.ExecuteSqlCommand(script);
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-08 06:12

    If you have change in your entities, you need first run add-migration to create the migration script.

    After that in your Global.asax

    you need to have some code like this

            var configuration = new MyProject.Configuration();
            var migrator = new System.Data.Entity.Migrations.DbMigrator(configuration);            
    
            migrator.Update();
    

    every time that you run your asp.net project it'll check if you have a new migration to run and run update-database automatically for you.

    0 讨论(0)
  • 2020-12-08 06:16

    Automatic Migrations means that you don't need to run add-migration command for your changes in the models, but you have to run update-database command manually.

    If Automatic Migrations is enabled when you call update-database, if there are pending changes in your models, an 'automatic' migration will be added and database will be updated.

    If you want that your database is updated without need to call update-database command, you can add Database.SetInitializer(...) in OnModelCreating() method on your context, like so:

    public class MyContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, MigrateDBConfiguration>());
        }
    
        ...
    }
    
    public class MigrateDBConfiguration : System.Data.Entity.Migrations.DbMigrationsConfiguration<MyContext>
    {
        ...
    

    Note that you should declare DbMigrationsConfiguration and MigrateDatabaseToLatestVersion with your real context, not the default DbContext.

    0 讨论(0)
提交回复
热议问题