Como recriar o banco de dados para o Entity Framework?

143

Entrei em um estado ruim com meu projeto ASP.Net MVC 5, usando o Code-First Entity Framework. Não me importo com a perda de dados, só quero poder começar de novo, recriar o banco de dados e começar a usar migrações Code-First.

Atualmente, estou em um estado em que todas as tentativas de atualizar o banco de dados resultam em uma exceção ou uma mensagem de erro. Além disso, o site não pode acessar o banco de dados corretamente. Como posso limpar todas as migrações, recriar o banco de dados e começar do zero sem precisar criar um novo projeto? Em outras palavras, quero manter meu código, mas largar o banco de dados.

Mais tarde, também desejarei sincronizar o banco de dados de implantação (SQL Server no Azure). Mais uma vez, não me importo de soltar todos os dados - só quero fazê-los funcionar.

Forneça todas as instruções para voltar a um estado limpo. Muito apreciado.

Toby Sharp
fonte
TBH se você simples querer DROP DATABASEentão ....
Worthy7

Respostas:

209

Siga as etapas abaixo:

1) Primeiro, vá para o Server Explorer no Visual Studio, verifique se as conexões de dados ".mdf" deste projeto estão conectadas; nesse caso, clique com o botão direito do mouse e exclua.

2) Vá para o Gerenciador de Soluções, clique no ícone Mostrar Todos os Arquivos.

3) Vá para App_Data, clique com o botão direito do mouse e exclua todos os arquivos ".mdf" deste projeto.

4) Exclua a pasta Migrations clicando com o botão direito e excluindo.

5) Vá para o SQL Server Management Studio, verifique se o banco de dados deste projeto não está lá, caso contrário, exclua-o.

6) Acesse o Package Manager Console no Visual Studio e digite:

  1. Enable-Migrations -Force
  2. Add-Migration init
  3. Update-Database

7) Execute seu aplicativo

Nota: Na etapa 6, parte 3, se você receber o erro "Não é possível anexar o arquivo ...", é possível que você não tenha excluído os arquivos do banco de dados completamente no SQL Server.

Lin
fonte
Excelente! Isso funcionou, obrigado! Muito útil mesmo. As etapas são semelhantes para recriar o banco de dados de implantação (Azure SQL)?
Toby afiada
oi @TobySharp, sem problemas. Se você não tiver nenhum dado no banco de dados, poderá seguir estas etapas, mas se você tiver dados, as etapas não serão as mesmas.
Lin
Não tenho dados que preciso manter.
quer
3
Atualização, se você excluir do VS (como as instruções dizem) e não do Windows Explorer, ele funcionará. Além disso, se você não tiver o SQL Management Studio, poderá usar o Sql Object Explorer no VS para excluir de um localdb.
Mike Ward
3
Se você estiver recebendo o erro "Não é possível anexar arquivo ...", mesmo que acredite ter excluído tudo, tente a resposta neste segmento: stackoverflow.com/questions/13275054/…
Andy
44

Gostaria de acrescentar que a resposta de Lin está correta.

Se você excluir o MDF incorretamente, precisará corrigi-lo. Fixar as conexões parafusadas no projeto ao MDF. Resposta curta; recrie e exclua-o corretamente.

  1. Crie um novo MDF e atribua um nome igual ao antigo, coloque-o no mesmo local da pasta. Você pode criar um novo projeto e criar um novo mdf. O mdf não precisa corresponder às suas tabelas antigas, porque o excluiria. Portanto, crie ou copie um antigo para a pasta correta.
  2. Abra-o no server explorer [clique duas vezes no mdf do solution explorer]
  3. Exclua-o no server explorer
  4. Exclua-o do Solution Explorer
  5. executar update-database -force [Use força, se necessário]

Feito, aproveite seu novo banco de dados

ATUALIZAÇÃO 11/12/14 - Uso isso o tempo todo quando faço uma alteração de db de interrupção. Achei que essa é uma ótima maneira de reverter suas migrações para o banco de dados original:

  • Coloca o banco de dados de volta ao original
  • Execute a migração normal para voltar ao atual

    1. Update-Database -TargetMigration:0 -force [Isso destruirá todas as tabelas e todos os dados.]
    2. Update-Database -force [use força se necessário]
Steve Coleman
fonte
1
Fico feliz em ajudar ... Vou atualizar minha resposta. Recentemente, encontrei uma maneira melhor de reverter todas as alterações.
9788 Steve Jobsman
8

Isso funcionou para mim:

  1. Exclua o banco de dados do SQL Server Object Explorer no Visual Studio. Clique com o botão direito e selecione excluir.
  2. Exclua os arquivos mdf e ldf do sistema de arquivos - se eles ainda estiverem lá.
  3. Reconstrua a solução.
  4. Iniciar aplicativo - o banco de dados será recriado.
Donal
fonte
1
Sim, tudo o que eu precisava fazer era excluir o MDF, atualizar a cadeia de conexão no web.config, executar o aplicativo e registrar uma nova conta. Ele criou todas as tabelas novamente no novo banco de dados automaticamente.
Dan Bechard
3

Embora essa questão tenha como premissa não se importar com os dados, às vezes a manutenção dos dados é essencial.

Em caso afirmativo, escrevi uma lista de etapas sobre como recuperar o pesadelo do Entity Framework quando o banco de dados já possui tabelas com o mesmo nome aqui: Como recuperar o pesadelo do Entity Framework - o banco de dados já possui tabelas com o mesmo nome

Aparentemente ... um moderador achou adequado excluir minha postagem, então colarei aqui:

Como recuperar do pesadelo do Entity Framework - o banco de dados já possui tabelas com o mesmo nome

Descrição : se você gosta de nós quando sua equipe é nova na EF, você terminará em um estado em que não poderá criar um novo banco de dados local ou não poderá aplicar atualizações ao banco de dados de produção. Você quer voltar para um ambiente EF limpo e seguir o básico, mas não pode. Se você trabalhar para produção, não poderá criar um banco de dados local e, se trabalhar para local, seu servidor de produção ficará fora de sincronia. E, finalmente, você não deseja excluir nenhum dado do servidor de produção.

Sintoma : Não é possível executar o Update-Database porque está tentando executar o script de criação e o banco de dados já possui tabelas com o mesmo nome.

Mensagem de erro: System.Data.SqlClient.SqlException (0x80131904): Já existe um objeto chamado '' no banco de dados.

Histórico do problema : O EF entende onde o banco de dados atual está comparado com o código, com base em uma tabela no banco de dados chamada dbo .__ MigrationHistory. Quando olha para os scripts de migração, ele tenta reconsilar onde estava com os scripts. Se não puder, apenas tenta aplicá-las em ordem. Isso significa que ele volta ao script de criação inicial e, se você observar a primeira parte do comando UP, será a CreeateTable da tabela em que o erro estava ocorrendo.

Para entender isso com mais detalhes, recomendo assistir aos dois vídeos mencionados aqui: https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx

Solução : O que precisamos fazer é induzir a EF a pensar que o banco de dados atual está atualizado enquanto não aplica esses comandos CreateTable. Ao mesmo tempo, ainda queremos que esses comandos existam para que possamos criar novos bancos de dados locais.

Etapa 1: DB de produção limpo Primeiro, faça um backup do seu banco de dados de produção. No SSMS, clique com o botão direito do mouse no banco de dados, selecione "Tarefas> Exportar aplicativo da camada de dados ..." e siga as instruções. Abra seu banco de dados de produção e exclua / solte a tabela dbo .__ MigrationHistory.

Etapa 2: Limpeza do ambiente local Abra sua pasta de migrações e exclua-a. Estou assumindo que você pode recuperar tudo isso do git, se necessário.

Etapa 3: Recriar a inicial No Package Manager, execute "Enable-Migrations" (a EF solicitará que você use -ContextTypeName se você tiver vários contextos). Execute "Add-Migration Initial -verbose". Isso criará o script inicial para criar o banco de dados do zero com base no código atual. Se você teve alguma operação inicial no Configuration.cs anterior, copie-a.

Etapa 4: Truque EF Neste ponto, se executássemos o Update-Database , estaríamos recebendo o erro original. Portanto, precisamos induzir a EF a pensar que está atualizada, sem executar esses comandos. Portanto, entre no método Up na migração inicial que você acabou de criar e comente tudo.

Etapa 5: Atualizar banco de dados Sem código a ser executado no processo Up, o EF criará a tabela dbo .__ MigrationHistory com a entrada correta para dizer que executou esse script corretamente. Vá e confira se quiser. Agora, remova o comentário desse código e salve. Você pode executar o Update-Database novamente se quiser verificar se o EF está atualizado. Ele não executará a etapa Up com todos os comandos CreateTable, porque acha que já fez isso.

Etapa 6: confirmar se a EF está realmente atualizada Se você tinha um código que ainda não tinha migrações aplicadas a ele, foi isso que eu fiz ...

Executar "Migração Missing de Adicionar Migração" Isso criará praticamente um script vazio. Como o código já estava lá, havia realmente os comandos corretos para criar essas tabelas no script de migração inicial, então eu apenas cortei os comandos Drop e CreateTable e equivalentes nos métodos Para cima e Para baixo.

Agora, execute o Update-Database novamente e observe-o executar seu novo script de migração, criando as tabelas apropriadas no banco de dados.

Etapa 7: confirme novamente e confirme. Construa, teste, execute. Verifique se tudo está em execução e confirme as alterações.

Etapa 8: informe ao restante da equipe como proceder. Quando a próxima pessoa atualizar, a EF não saberá o que ocorreu, uma vez que os scripts executados antes não existem. Mas, supondo que os bancos de dados locais possam ser ampliados e recriados, tudo isso é bom. Eles precisarão descartar o banco de dados local e adicionar criá-lo da EF novamente. Se eles tiverem alterações locais e migrações pendentes, eu recomendo que eles criem seu banco de dados novamente no master, alternem para a ramificação de recursos e recriem esses scripts de migração do zero.

System.Exception
fonte
1

Só quero acrescentar à excelente resposta do @Lin:

5) B. Se você não possui o SQL Management Studio, vá para "SQL Server Object Explorer". Se você não conseguir ver o banco de dados do projeto no localdb "SQL Server Object Explorer", clique no botão "Adicionar servidor SQL" para adicioná-lo à lista manualmente. Em seguida, você pode excluir o banco de dados da lista.

Dudi
fonte
Se você deseja adicionar algo a uma resposta, adicione um comentário a essa resposta em vez de postar uma nova resposta.
Oliver
1
Eu não estava ciente disso. Então, agora você pode mover a sua resposta em um comentário e apagar esta resposta uma vez que tecnicamente não é um (completa) resposta para a pergunta :-)
Oliver
0

Uma possível correção muito simples que funcionou para mim. Após excluir quaisquer referências e conexões do banco de dados encontradas no server / serverobject explorer, clique com o botão direito do mouse na pasta App_Data (não mostrou nenhum objeto no aplicativo para mim) e selecione Abrir. Uma vez aberto, coloque todo o banco de dados / etc. arquivos em uma pasta de backup ou, se você tiver coragem, exclua-os. Execute seu aplicativo e ele deve recriar tudo do zero.

edencorbina
fonte
0

Minha solução é mais adequada para :
- excluiu seu arquivo mdf
- deseja recriar seu db.

Para recriar seu banco de dados, você precisa adicionar a conexão usando o Visual Studio.

Etapa 1 : Vá para o Server Explorer e adicione uma nova conexão (ou procure um ícone add db).

Etapa 2 : Altere a fonte de dados para o arquivo de banco de dados do Microsoft SQL Server .

Etapa 3 : adicione qualquer nome de banco de dados desejado no campo Nome do arquivo de banco de dados . (De preferência o mesmo nome que você possui no atributo web.config AttachDbFilename )

Etapa 4 : clique em procurar e navegue até onde você deseja que ele esteja localizado.

Etapa 5 : no comando run do console do gerenciador de pacotesupdate-database

Mbuso Mkhize
fonte