Penso che il debugger si interrompa perché i file PDB sono inclusi nei pacchetti NuProf MiniProfiler.
L'interruzione si verifica quando un'eccezione viene generata dall'entità framework mentre tenta di determinare se la colonna CreatedOn
esiste nella tabella __MigrationHistory
. (codice estratto utilizzando IlSpy da System.Data.Entity.Migrations.History.HistoryRepository.GetUpgradeOperations()
)
bool flag = false;
try
{
this.InjectInterceptionContext(legacyHistoryContext);
using (new TransactionScope(TransactionScopeOption.Suppress))
{
(
from h in legacyHistoryContext.History
select h.CreatedOn).FirstOrDefault<DateTime>(); // Will throw an exception if the column is absent
}
flag = true;
}
catch (EntityException)
{
}
if (flag)
{
// Remove the column if present (if no exception was thrown)
yield return new DropColumnOperation("dbo.__MigrationHistory", "CreatedOn", null);
}
Si può notare che se si crea manualmente la colonna per evitare l'eccezione, verrà rimosso sulla prossima corsa e l'eccezione tornerà. Come MiniProfiler si interpone in DbCommand.ExecuteReader(), si trova sul percorso dell'eccezione prima del catch (la query linq si traduce in una query sql ed infine viene eseguita utilizzando un DbCommand).
si hanno due soluzioni per evitare che la pausa dal verificano:
pause Disattiva per quel tipo di eccezione
È possibile disattivare rottura su una particolare eccezione nel debugger di Visual Studio. Sto lavorando con Sql CE quindi ho dovuto prima dichiarare lo SqlCeException
(passaggio 2 a 4). Se stai lavorando con SqlServer probabilmente puoi saltare questo passaggio, basta controllare che il tipo dell'eccezione generata sia già presente nell'elenco.
- Aprire la finestra di dialogo 'Eccezioni' (menu Debug/eccezioni)
- pulsante 'Aggiungi ...', selezionare 'Eccezioni Common Language Runtime' come tipo.
- Impostare il nome dell'eccezione su "System.Data.SqlServerCe.SqlCeException"
- Convalidare e mantenere aperta la finestra di dialogo "Eccezioni".
- Aprire la sezione "Eccezioni di runtime in linguaggio comune" nell'elenco.
- Deselezionare entrambe le caselle di controllo davanti a
System.Data.SqlServerCe.SqlCeException
(o l'eccezione che viene generata nel caso) e chiudere la finestra di dialogo.
L'eccezione non dovrebbe causare un'interruzione da ora. Tuttavia, il debugger non si romperà nemmeno nel proprio codice, e se un altro tipo di eccezione viene generato da MiniProfiler in un altro caso, si verificherà nuovamente un'interruzione.
Rimuovere i file PDB
È possibile rimuovere i file del MiniProfiler PPB, ma si dovrà rimuovere i riferimenti Nuget:
- Individuare e fare una copia della DLL del MiniProfiler (dal cartella bin del progetto). Ovviamente, non fare una copia dei file pdb.
- Rimuovi tutti i riferimenti NuGet a MiniProfiler.
- Aggiungere riferimenti alle DLL copiate in una cartella diversa.
Lo svantaggio è che non sarà possibile utilizzare NuGet per aggiornare MiniProfiler.
Forse una soluzione migliore sarebbe rimuovere il PDB dal pacchetto NuGet, ma non so se sono necessari per un altro scopo.
Modifica
Come jrummell lo fa notare nel suo commento, i file del PDB possono essere eliminate con un messaggio Genera eventi. In questo modo puoi mantenere i tuoi riferimenti NuGet.
http://community.miniprofiler.com/t/sqlexception-on-ef-5-w-net-4-5/71/2 –
Sono consapevole di questo lavoro intorno/collegamento. Tuttavia, la domanda era come risolverlo non lavorando intorno ad esso (significa nessuna soluzione alternativa). – Quoter
Sono disponibili ulteriori informazioni sull'eccezione? Forse anche qualche codice sorgente? – BonanzaOne