2016-09-16 6 views
4

Есть ли какой-либо код для автоматической миграции в Entity Framework corecode first в проекте asp.net core?Автоматические миграции EntityFramework Core

Я делаю это просто в MVC4/5 путем добавления

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

Это экономит время, когда объекты изменились

+0

Это называется EntityFramework ядра 1,0, благодаря – Tseng

ответ

5

Вы можете позвонить context.Database.Migrate() в вашем Startup.cs

например:

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

MyContext выглядит таким образом, я не знаю, что поставить в настройках общественного ApplicationDbContext (DbContextOptions опции): база (варианты) {} –

+0

Обратитесь к этой статье, чтобы увидеть, как вы можете вручную настроить свой контекст http://stackoverflow.com/questions/38417051/what-goes-into-dbcontextoptions-when-invoking-a-new-dbcontext и https://github.com/aspnet/EntityFramework/issues/ 6493 –

+0

Я делаю следующий путь в Startup.cs: Startup :: Configure после определения маршрутов я добавляю: var options = new DbContextOptionsBuilder (); options.UseSqlServer (Configuration.GetConnectionString ("DefaultConnection")); using (var context = new ApplicationDbContext (options.Options)) { context.Database.Migrate(); }, но это не выполняет миграции –

0

мой лучший совет - не использовать автоматическую миграцию. Это все пути лучше добавлять миграции вручную, а также избегать массовой миграции и придерживаться наилучшей практики для ручной миграции.

Автоматическая миграция не является волшебным инструментом, и вы можете захотеть добавить некоторые дополнительные изменения в перенос. Вы выполняете только с помощью ручной миграции.

Чтобы включить миграцию типа «включить-миграции» в менеджере пакетов консоли

Таким образом, вы будете иметь полный контроль над обновлением или понижая свою базу данных, а также легко отслеживать миграцию.

Всего три простых шага в консоли диспетчера пакетов.

1) адд-миграция [некоторое имя для миграции]

2) миграций генерируется для изменений, вы их обзор, а также можете внести в него изменения

3) обновление-ваша базы данных миграция завершена.

Обработка миграции менее болезненна!

9

EF сердечник не поддерживаетautomatic migrations. Так вы должны сделать это вручную.

С точки зрения автоматической миграции как функцию, мы не планируют реализовать в EF Ядра, как опыт показал, базовый код миграции быть более управляемым подход.

Вы можете прочитать полную историю здесь: Not to implement Automatic Migrations

+4

Как бы то ни было, она отлично работала для меня во всех проектах, над которыми я работала, что привело к чрезвычайно экономному обслуживанию, особенно во время создания проекта. Позор, что он ушел, но я могу себе представить, что накладные расходы не стоили этого. – Arwin

+0

По-прежнему нет возможности для автоматической миграции в EF Core 2.0 в сентябре 2017 года? –

+0

Возможно, это помогает: @Afshar https://github.com/aspnet/EntityFrameworkCore/issues/8045 – Sampath

1

Автоматическая миграция не поддерживается в 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(); // применение всех миграций 
      _migrated[0] = true; 
     } 
    } 

Это не элегантный, но работает.

+0

Почему вы используете массив, если вы получаете доступ только к элементу в 0? – ProfK

+2

, чтобы иметь одно поле для блокировки и быструю проверку без распаковки. – Mentor

6

Это, как они делают это в 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(); 
     ... 
    } 
} 
2

После документации от 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(); 
    } 

В моем случае, я проверяю окружение, чтобы убедиться, что я нахожусь в разработке, так что я могу контролировать Перемещения/обновления , Однако в производстве я хочу, чтобы они были автоматическими для непрерывной интеграции. Как отмечали другие, это, вероятно, не лучшие практики, но на небольших проектах он отлично работает.