Há algum problema em atualizar um database de produção com migrações do EF?

De acordo com este post, a maioria das empresas que usam o EF Migrations não estão atualizando o esquema de bancos de dados de produção com migrações do EF. Em vez disso, o autor da postagem do blog recomenda o uso de scripts de atualização do esquema como parte do processo de implantação.

Eu usei scripts de atualização do Schema por alguns anos e enquanto eles funcionam, eu estava planejando usar as migrações do EF no futuro pelos seguintes motivos:

  • Implantação mais rápida, menos tempo de inatividade
  • Um procedimento de implantação mais simples
  • Migração muito mais fácil de dados existentes do que seria possível com o T-SQL
  • Uma syntax mais compreensível das alterações que estão aguardando para serem aplicadas (class DbMigration com script de syntax C # limpo versus script de migration T-SQL desajeitado em um ambiente tradicional).
  • Há um caminho de downgrade fácil e rápido para o antigo esquema de database se a implementação da nova versão do software falhar

Uma razão pela qual posso pensar que proibiria o uso de EF para migrar um database de produção seria se o esquema do database fosse alterado apenas pelos DBAs em vez dos Desenvolvedores. No entanto, eu sou DBA e Developer, então isso não importa no meu caso.

Então, quais são os riscos de atualizar um database de produção usando o EF?

Edit: Eu gostaria de acrescentar que, como solomon8718 já sugeriu, eu estou sempre puxando uma cópia nova do database de produção para o meu servidor de temporariedade e testar as Migrações EF a serem aplicadas no servidor de temporariedade antes de aplicá-las a um servidor de produção. OMI isto é essencial para qualquer atualização de esquema para um sistema de produção, quer eu esteja usando migrações EF ou não.

Bem, vou tentar responder de qualquer maneira. Eu diria Não, não há razão para não usar o Code First Migrations em produção. Afinal de contas, qual é o objective deste sistema fácil de usar se você não puder ir até o fim?

Os maiores problemas que vejo com isso são todos os problemas que você pode ter com qualquer sistema, o que você já notou. Contanto que toda a equipe (DBA incluída, se aplicável) esteja envolvida com ela, acho que permitir que o EF gerencie o esquema por meio de migrações seja menos complexo e, portanto, menos propenso a erros do que o gerenciamento baseado em script tradicional. Eu ainda teria um backup antes de realizar uma migration em um sistema de produção, mas então você faria isso de qualquer maneira.

Não há nada que diga que um DBA também não possa executar uma migration do Visual Studio. O access ainda pode ser bloqueado com privilégios no nível do database e ele pode revisar a migration (em um formato de exportação SQL útil usando -Script , se desejado) antes de executar a operação real. Então eles ainda estão no controle, mas você pode usar migrações de primeiro código. Inferno, eles podem até acabar gostando!

Atualização: como os SPROCs e TVFs foram criados, também lidamos com aqueles em migrações, embora na verdade eles sejam feitos com instruções SQL diretas usando uma chamada DbMigration.Sql() no Up() , e o reverso delas no Down() (Você também pode usar CreateStoredProcedure e DropStoredProcedure para DropStoredProcedure simples, mas eu acho que você ainda tem que definir o próprio corpo em SQL). Eu acho que você poderia dizer que é uma ressalva; Ainda não há uma maneira de um database completo e abrangente ser escrito exclusivamente em C #. No entanto, você pode usar migrações que incluem scripts SQL para gerenciar todo o esquema. Um benefício que descobrimos nesse processo é que você pode usar o arquivo de configuração C # para nomes de object de esquema (diferentes nomes de servidor para produção vs dev por exemplo) com um String.Format simples, combinado com XML Transformation para os próprios arquivos de configuração.

Sim, há boas razões para não usar um sistema automatizado como o Code First Migrations para fazer alterações no database de produção . Mas como sempre há exceções às regras.

  1. Uma das razões mencionadas seriam as permissions de access, que estariam diretamente relacionadas às regras de gerenciamento de alterações e políticas de segurança da sua organização.

  2. Outra razão seria o seu nível de confiança na própria ferramenta Migrations. Temos certeza de que a ferramenta não contém um bug? O que acontece se a ferramenta falhar no meio do caminho? Tem certeza de que você tem backups atualizados e um processo para reverter, se necessário?

  3. Os scripts de mudança podem executar scripts inesperados ou ineficientes. Eu experimentei casos em que o sql gerado copiou os dados em uma tabela temporária, descartou a tabela original e recriou a tabela original para coisas como adicionar uma nova coluna se você acidentalmente (ou intencionalmente) alterar a ordem na qual a coluna aparece, ou quando você renomeia a tabela. Se milhões de registros estiverem envolvidos, isso pode causar sérios problemas de desempenho.

Minha recomendação:

Supondo que você tenha um database Staging que espelhe seu esquema de produção, use a ferramenta Migrations para gerar seus scripts de alteração nesse sistema. Geralmente restauramos nosso database de estágio de uma nova cópia de produção antes de executá-lo. Em seguida, examinamos os scripts de alteração manualmente para verificar problemas. Depois disso, executamos os scripts em nosso database de estágio para garantir que ele seja executado corretamente e que todas as alterações esperadas tenham ocorrido. Agora, temos certeza de que os scripts são seguros para serem executados na produção e executar as alterações esperadas. Esse processo resolveria todos os três problemas listados acima.

Uma outra advertência que encontrei: Se você tem vários sites usando o mesmo contexto de dados, é necessário garantir que todos eles sejam atualizados ao mesmo tempo. Caso contrário, pode haver uma luta constante de atualização / rebaixamento do database entre os sites. Fora isso, funcionou bem para mim.

EDIT: Minha própria perspectiva, um ano depois de começar a usar o EF Migrations em produção:

O EF Migrations é realmente muito legal, mesmo para uso em produção, desde que você

  1. Teste as migrações em um sistema de teste. Eu testo todas as migrações migrando todo o caminho para baixo e para cima novamente no meu servidor de CI antes de executar os testes de integração.
  2. Não acione migrações automaticamente, mas com um arquivo em lotes iniciado por um administrador. Isso é essencialmente o mesmo que executar o sql para uma migration manualmente no SSMS.

Eu uso isso em produção para alguns projetos. Depois de pegar o jeito, acho que está tudo bem.

Durante o desenvolvimento, você pode manter migrações automáticas, mas no final, você pode se conectar ao database ativo diretamente do console do gerenciador de pacotes e gerar uma migration. Ele vai te dar uma migration para todas as mudanças.

Mas sempre sempre sempre use a opção -script com update-database e -script o SQL por conta própria.

Eu também aconselharia não usar a opção update db from web deploy. Dessa forma, não há como saber quanto da migration já foi acionado por erro. Eu tive problemas com isso algumas vezes. Então, é melhor pegar o SQL e triggersr manualmente.