Gere um script SQL completo a partir das migrações do primeiro código do EF 5

145

Como uso as migrações de código primeiro do Entity Framework 5 para criar um script de banco de dados completo do estado inicial (vazio) para a migração mais recente?

A postagem do blog do MSDN Blog sugere fazer isso, mas parece criar um script vazio:

Update-Database -Script -SourceMigration: $InitialDatabase
Matt Wilson
fonte

Respostas:

286

A API parece ter mudado (ou pelo menos não funciona para mim).

A execução do seguinte no Console do Gerenciador de Pacotes funciona conforme o esperado:

Update-Database -Script -SourceMigration:0
Matt Wilson
fonte
14
Sei que essa é a resposta correta, mas como você descobriu que 0 funciona quando o parâmetro é normalmente uma string ?!
Dave R
27
Julgamento justo e erro realmente depois de tentar tudo o que eu poderia pensar em enganá-lo para trabalhar :)
Matt Wilson
1
Isso cria uma cópia exata do banco de dados? Incluindo o conteúdo da tabela?
Multitut
2
@ Multitut: não, isso fará apenas a estrutura.
Martin Clarke
6
Apenas no caso de alguém está procurando como fazer isso em EfCore e acabou aqui como eu, o comando é: dotnet ef migrations script. Mais informações sobre a documentação: docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/...
Rafael Miceli
13

Para quem usa o núcleo da estrutura da entidade que termina aqui. É assim que se faz.

# Powershell / Package manager console
Script-Migration

# Cli 
dotnet ef migrations script

Você pode usar o parâmetro -Frome -Topara gerar um script de atualização para atualizar um banco de dados para uma versão específica.

Script-Migration -From 20190101011200_Initial-Migration -To 20190101021200_Migration-2

https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#generate-sql-scripts

Existem várias opções para este comando.

A migração from deve ser a última migração aplicada ao banco de dados antes de executar o script. Se nenhuma migração foi aplicada, especifique 0(esse é o padrão).

A migração para é a última migração que será aplicada ao banco de dados após a execução do script. O padrão é a última migração no seu projeto.

Opcionalmente, um script idempotente pode ser gerado. Este script somente aplica migrações se elas ainda não foram aplicadas ao banco de dados. Isso é útil se você não souber exatamente qual foi a última migração aplicada ao banco de dados ou se estiver implementando em vários bancos de dados que podem estar em uma migração diferente.

Justin Lessard
fonte
Isso funciona até certo ponto. Depois de começar a alterar os nomes das colunas, ele começará a gerar erros, criar um DacPac é uma solução melhor. Especialmente quando você começa a usar Pipelines no CI / CD
Nick Turner
8

Para adicionar à resposta de Matt Wilson, eu tinha um monte de classes de entidade com primeiro código, mas nenhum banco de dados, pois não havia feito backup. Então, fiz o seguinte no meu projeto do Entity Framework:

Abra o console do Gerenciador de Pacotes no Visual Studio e digite o seguinte:

Enable-Migrations

Add-Migration

Atribua um nome à sua migração como 'Inicial' e crie a migração. Por fim, digite o seguinte:

Update-Database

Update-Database -Script -SourceMigration:0

O comando final criará suas tabelas de banco de dados a partir de suas classes de entidade (desde que suas classes de entidade sejam bem formadas).

Tahir Khalid
fonte