Estou usando o código do Entity Framework primeiro no meu site e estou me perguntando se existe alguma maneira de depurar os códigos de migração. Você sabe, como definir pontos de interrupção e coisas assim.
Estou usando o Package Manager Console para atualizar o banco de dados usando Update-Database
.
obrigado
Respostas:
Eu sei que a EF Code First Migrations é uma ferramenta relativamente nova, mas não esqueça que você ainda está no .NET.
Então você pode usar:
Depois disso, você pode ver sua InnerException.
Ou você pode usar a instrução try ... catch como esta: Exceção ao lidar com o Entity Framework
fonte
Para atingir um ponto de interrupção em uma migração de banco de dados, defina o contexto como MigrateDatabaseToLatestVersion na inicialização.
Então você apenas depura normalmente (execute usando f5) e o ponto de interrupção será atingido na primeira vez em que o projeto for executado.
O problema agora é que, se você depurar uma segunda vez, a migração não será executada. Isso ocorre porque a tabela __MigrationHistory foi atualizada para dizer que você migrou para a versão mais recente. Para testar novamente a migração, abra o console do gerenciador de pacotes e faça o downgrade para a migração anterior:
fonte
Minha resposta pode ser um pouco boba, mas mesmo assim aqui vai. Se você, como eu, algumas vezes tem problemas no método Seed (), o que eu costumo fazer é simplesmente criar um método público que chama Protect Seed ().
então, no meu HomeController, chamo esse método no modo de depuração.
Eu sei que é uma solução um pouco esfarrapada, mas é simples e rápida. Obviamente, isso deve ser feito após a criação do modelo. Então, passo a passo:
descomente o método Seed () e conecte o "hack" que mencionei acima.
na configuração, desative Migrações automáticas
AutomaticMigrationsEnabled = false; // se você tiver esse desativado, pule esta etapa
Depure seu aplicativo, corrija o erro e remova o "hack"
fonte
Aqui está um método mais à prova de falhas que fará o truque sem muito barulho:
Etapa 1: coloque esse trecho de código logo acima da migração que você deseja depurar:
Etapa 2: compilar o projeto que contém suas migrações
Etapa 3: abra um console dentro do diretório de saída (/ bin / Debug, / bin / Release etc) contendo a dll de suas migrações
Etapa # 4: Invoque migrate.exe com o parâmetro / scriptFile para iniciar o depurador e depurar o db-migration desejado
Depois que a caixa de diálogo seletor de depurador aparecer, escolha a instância do visual studio que você já abriu.
fonte
Você pode adicionar instruções Console.WriteLine ao código de migração (não é uma ótima solução)
Observe que as mensagens são mostradas apenas se você executar o código de migração usando o
migrate.exe
utilitário (inpacakges\EntityFramework.x.y.z\tools
). Eles não serão exibidos se você executar a migração pelo console do Package Manager.fonte
Eu tive muita sorte usando "Debugger.Launch ()" (como na resposta de m_david acima ) em outro lugar, mas dentro do CreateDbContext parece de alguma forma ambos anexar e não anexar. O que quero dizer é que ele anexa e começa a tentar entrar nos arquivos .asm e .cpp (código interno). Se eu tentar definir um ponto de interrupção em um Console.Writeline que SEI executado depois (eu posso ver a saída de QUALQUER "dotnet ef migrations COMMAND"), ele o executa e nunca atinge o ponto de interrupção.
Isto é o que funcionou para mim:
Você pode executar a migração e manualmente anexar usando o Visual Studio e ele vai realmente deixá-lo percorrer o código como você espera, é apenas mais uma dor. O que eu realmente deveria tentar é a combinação dos dois métodos ...
fonte
Também encontrei um truque legal aqui para obter os detalhes do erro ...
Basicamente, o truque é pegar todas as informações de uma exceção, colocá-las em uma string e lançar uma nova DbEntityValidationException com a string gerada e a exceção original.
fonte