Como posso desativar as migrações iniciais de código

86

Eu tenho um modelo de entidade code-first no EF5. Mas eu quero gerenciar as alterações do banco de dados manualmente - não quero que EF modifique meu banco de dados existente e todos os seus dados. Mas quando faço alterações paralelas no mapeamento do EF e no banco de dados, o EF se recusa a operar adequadamente, dizendo que preciso usar primeiro a migração de código. Como faço para desligar isso?

Stan Hargrove
fonte
Possível duplicata de Como posso desativar a migração no Entity Framework 6.0
Michael Freidgeim

Respostas:

102

defina o Database.SetInitializer como null.

public class DatabaseContext: DbContext
{
    //the base accepts the name of the connection string provided in the web.config as a parameter
    public DatabaseContext()
        : base("DatabaseContext")
    {
        //disable initializer
        Database.SetInitializer<DatabaseContext>(null);
    }
Sarath Rachuri
fonte
2
Definir o inicializador no construtor de instância do contexto não faz sentido. EF irá chamar o inicializador antes de realmente chegar a esse código se você tentar criar um novo contexto.
Jcl
1
Acabei de verificar a resposta observando a "Ferramenta de diagnóstico" no VS 2017. As chamadas ADO.NET antes da primeira consulta SQL desejada pararem após definir o inicializador como nulo no construtor.
Karl
2
Funciona como esperado. É verdade que o EF irá chamar o inicializador antes, mas chamá-lo novamente dentro do construtor faz com que o DbContext simplesmente ignore as migrações, caso você queira ignorar o fato de __MigrationHistorynão ter a migração mais recente e não querer faça isto de qualquer maneira. No meu caso, uso migrações no ambiente de desenvolvimento, mas quando implanto para produção, uso SSDT para atualizar o banco de dados. Portanto, EF reclamaria que o modelo mudou porque __MigrationHistorynão teria a migração mais recente, mas posso garantir que o banco de dados está atualizado.
Alisson
Eu sugeriria mover a chamada Database.SetInitializerdo construtor para o construtor da classe. Isso garante que a chamada seja feita apenas uma vez.
Steven
41

Portanto, a resposta mais completa que encontrei é esta:

  1. Exclua a Migrationspasta dentro do seu projeto.
  2. Defina Database.SetInitializer<DatabaseContext>(null);dentro de seu inicializador DatabaseContext.
  3. Exclua a tabela de __MigrationHistoryseu banco de dados. Para EF6 +, a tabela está localizada em, Tablesmas para versões anteriores, está localizada em System Tables.
  4. Construa e execute.
  5. Lucro.
Karlingen
fonte
Infelizmente, após seguir essas etapas, o EF6 ainda verifica a existência de __MigrationHistorycada vez que meu aplicativo é inicializado, o que adiciona alguns milissegundos a mais ao tempo de inicialização do meu aplicativo. Existe uma maneira de desabilitar __MigrationHistorytotalmente a verificação?
Dia
27

Se você deseja desativar completamente as migrações:

https://stackoverflow.com/a/9709407/141172

No entanto, achei melhor manter as migrações de código primeiro habilitadas, mas use a -Scriptopção de fazer com que EF crie um script de mudança de banco de dados para mim que eu possa aplicar a cada banco de dados (desenvolvimento, controle de qualidade, produção) manualmente:

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

Dessa forma, EF criará o script de alteração para mim, e ainda tenho controle total sobre as alterações que estão sendo aplicadas. Eu faço a versão dos scripts de mudança como qualquer outro código-fonte.

Eric J.
fonte
1
o seu link não corresponde realmente completely turn off migrations. Para fazer isso: adicione Database.SetInitializer<YourContextType>(null)à inicialização do seu aplicativo
Don Cheadle
Alguma ideia de como conseguir isso com o EF Core?
Shimmy Weitzhandler
@Shimmy: EF Core nunca deve tentar alterar seu banco de dados automaticamente. Consulte github.com/dotnet/efcore/issues/3152
Eric J.
26

Se você já usou Migrations, alterar apenas o Initializer não ajudará. Você precisa ir ao Management Studio, abrir as tabelas do banco de dados, ir para a System Tablespasta e remover a __MigrationHistorytabela que está localizada lá (para EF6 e superior, está localizado diretamente abaixo Tables). Isso desativará definitivamente as migrações.

Episodex
fonte
7
A tabela __MigrationHistory está localizada diretamente em Tabelas, não em Tabelas do sistema.
Peter Hedberg
6
@PeterHedberg Isso é verdade para EF6 +. Para versões anteriores, estava abaixo de System Tables.
Episodex
1
Você também pode renomear a tabela, em vez de excluí-la, usando sp_rename. Eu também desativei o inicializador.
NMrt
2

Acabei de resolver este "problema" por

  1. Excluindo a tabela "_MigrationHistory" do banco de dados.
  2. Excluindo a pasta "Migrações" do projeto.
  3. Atualizando arquivo EDMX.
  4. Limpe o projeto e reconstrua-o.

A configuração do meu ambiente está seguindo

1. Visual Studio 2017 15.8.2
2. ASP NET MVC project
3. .NET Framework 4.6.1
4. Entity Framework 6.2.0
DmitryBoyko
fonte
Posso perguntar o que você atualizou no arquivo EDMX? Também estou usando o Database First e ele ainda está consultando as tabelas de migração inexistentes ... Obrigado!
dalcam
E se mais tarde precisarmos de migrações, ele cria uma nova _MigrationHistorytabela automaticamente?
sairfan