2012-06-30 11 views
12

¿Cómo migrar la base de datos sin nuget? No es posible usar Visual Studio con nuget en el entorno de producción. Actualmente, muchos ejemplos solo nos enseñan a usar Visual Studio con nuget. ¿Cómo usar las clases generadas de DbMigration?Código EF Primera DbMigración sin nuget

Respuesta

12

La forma más sencilla es:

Database.SetInitializer(
    new MigrateDatabaseToLatestVersion<MyDbContext, 
             MyDbMigrationsConfiguration>()); 

Esto ejecutará las migraciones al inicializar el DbContext.

También puede forzar la ejecución de forma manual:

var migrator = new DbMigrator(new MyMigrationsConfiguration()); 
migrator.Update(); 

(creo que también hay que establecer TargetDatabase de la configuración, pero se puede tratar)

2

Puede hacerlo utilizando las herramientas de EF Power, existe el programa migrate.exe que puede usar para ejecutar migraciones desde el símbolo del sistema (publicación posterior, por ejemplo). Si desea ejecutar migraciones en la base de datos de producción, también puede usar el comando Actualizar-Base de datos para generar scripts SQL de las clases de migración, muy útil si necesita pasar por un DBA.

Herramientas Eléctricas EF están disponibles en la Galería de Visual Studio y opcionalmente here, echa un vistazo a esto muy útil video que, entre otras cosas, habla sobre el comando Update-Base de datos.

4

puede migrar a la última versión utilizando una Configuración de Web.config: consulte this blog post by Rowan Miller:

Si está utilizando Code First Migrations, puede configurar la base de datos para que se migre automáticamente utilizando la inicialización de MigrateDatabaseToLatestVersion er.

<contexts> 
    <context type="Blogging.BlogContext, MyAssembly"> 
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Blogging.BlogContext, 
MyAssembly], [Blogging.Migrations.Configuration, MyAssembly]], EntityFramework" /> 
    </context> 
</contexts> 

sólo cambio de su clase en el contexto aquí: la System.Data.Entity.MigrateDatabaseToLatestVersion es incorporado a EF. Esta configuración actualiza la versión anterior de AppSettings de la misma idea.

En mi opinión, esta es la mejor manera, porque la pregunta de qué inicializador usar es realmente una configuración, y quiere ser capaz de configurarlo en la Web, y aplicar idealmente transformaciones de configuración para trabajar en sus diferentes entornos .

5

Estas son las opciones:

  1. utilizar la herramienta de línea de comandos migrate.exe que se incluye en el paquete NuGet .
  2. Utilice el inicializador MigrateDatabaseToLatestVersion como que otros han descrito.
  3. Utilice la API de tiempo de ejecución disponible de la clase DbMigrator .
0

Estaba buscando una forma de controlar qué migraciones se ejecutan explícitamente en código sin la necesidad de una clase DbConfiguration o migraciones automáticas habilitadas.

Así logré crear la siguiente extensión:

public static void RunMigration(this DbContext context, DbMigration migration) 
{    
    var prop = migration.GetType().GetProperty("Operations", BindingFlags.NonPublic | BindingFlags.Instance); 
    if (prop != null) 
    { 
     IEnumerable<MigrationOperation> operations = prop.GetValue(migration) as IEnumerable<MigrationOperation>; 
     var generator = new SqlServerMigrationSqlGenerator(); 
     var statements = generator.Generate(operations, "2008"); 
     foreach (MigrationStatement item in statements) 
      context.Database.ExecuteSqlCommand(item.Sql); 
    } 
} 

A modo de ejemplo, tener una migración similar a la siguiente:

public class CreateIndexOnContactCodeMigration : DbMigration 
{ 
    public override void Up() 
    { 
     this.CreateIndex("Contacts", "Code"); 
    } 

    public override void Down() 
    { 
     base.Down(); 
     this.DropIndex("Contacts", "Code"); 
    } 
} 

usted podría funcionar usando su DbContext:

using (var dbCrm = new CrmDbContext(connectionString)) 
{ 
    var migration = new CreateIndexOnContactCodeMigration(); 
    migration.Up();     
    dbCrm.RunMigration(migration); 
} 
1

hay otra solución:

Using DB = New SHAContext() 
     If DB.Database.Exists() Then 
      Dim migrator As New DbMigrator(New SHAClassLibrary.Migrations.Configuration()) 
      For Each m In migrator.GetDatabaseMigrations() 
       Try 
        migrator.Update(m) 
       Catch ex As Exception 

       End Try 
      Next 
     End If 
     'DB.test() 
    End Using 
Cuestiones relacionadas