Метод доступа, который генерирует ядро ef миграции

#c# #asp.net-core #entity-framework-core

#c# #asp.net-core #entity-framework-core

Вопрос:

Можно ли каким-либо образом получить доступ к вызываемому методу, который создает миграцию базы данных при вызове Add-Migration в Entity Framework Core?

Это в проекте .NET Core 2.2, если это имеет значение.

Комментарии:

1. зачем вам нужен доступ к нему?

2. Потому что я хотел бы изменить порядок создаваемых столбцов.

Ответ №1:

Для доступа к Migration вы могли бы реализовать MigrationsAssembly .

  1. Реализовать ColumnOrderMigrationAssembly

     public class ColumnOrderMigrationAssembly : MigrationsAssembly
    {
        private readonly DbContext _context;
    
        public ColumnOrderMigrationAssembly(ICurrentDbContext currentContext,
            IDbContextOptions options, IMigrationsIdGenerator idGenerator,
            IDiagnosticsLogger<DbLoggerCategory.Migrations> logger)
        : base(currentContext, options, idGenerator, logger)
        {
            _context = currentContext.Context;
        }
    
        public override Migration CreateMigration(TypeInfo migrationClass,
            string activeProvider)
        {
            var migration = base.CreateMigration(migrationClass, activeProvider);
            var productTableMigration = migration.UpOperations.FirstOrDefault(m => m.GetType() == typeof(CreateTableOperation) 
            amp;amp; ((CreateTableOperation)m).Name == "Products") as CreateTableOperation;
            if (productTableMigration != null)
            {
                var columns =new List<AddColumnOperation>(productTableMigration.Columns.OrderBy(o => o.Name));
                productTableMigration.Columns.Clear();
                productTableMigration.Columns.AddRange(columns);
            }
            return migration;
        }
    }
      
  2. Регистрация ColumnOrderMigrationAssembly

     services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection"))
            .ReplaceService<IMigrationsAssembly, ColumnOrderMigrationAssembly>());
      
  3. Включить migrate

     public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
    {
        //your rest code
        using (var db = serviceProvider.CreateScope().ServiceProvider.GetRequiredService<ApplicationDbContext>())
        {
            db.Database.Migrate();
        }
    }
      

    Измените логику в CreateMigration в соответствии с вашими собственными требованиями.

Комментарии:

1. Это именно то, что мне было нужно. Спасибо @TaoZhou

Ответ №2:

в проекте, в котором вы запускаете Add-Migration, есть папка под названием Migration, в нее добавляются классы миграции. Вы можете изменить порядок столбцов при повторном запуске миграции.

Комментарии:

1. Когда у вас более 100 таблиц, я чертовски уверен, что не собираюсь вручную обновлять файл миграции.