2014-05-10 13 views
11

ho miniprofiler installato nel mio web app (asp.net-mvc) per EF 6.1, e si rompe su una linea con il seguente messaggio di errore:Miniprofiler rompe il mancante createdOn colonna

Un'eccezione di tipo 'System.Data .SqlClient.SqlException 'si è verificato in MiniProfiler.dll ma non è stato gestito nel codice utente

Ulteriori informazioni: nome colonna non valido' CreatedOn '.

Perché sta succedendo? Avevo EF 5 in passato e aggiornato alla versione 6 e successiva alla 6.1.

This e this post hanno alcune soluzioni alternative e stanno anche dicendo che questo accade quando si è aggiornato dalla versione 4.3. Questo non è il caso nella mia app web.

Qualcuno ha effettivamente risolto questo problema non lavorando intorno ad esso?

+0

http://community.miniprofiler.com/t/sqlexception-on-ef-5-w-net-4-5/71/2 –

+0

Sono consapevole di questo lavoro intorno/collegamento. Tuttavia, la domanda era come risolverlo non lavorando intorno ad esso (significa nessuna soluzione alternativa). – Quoter

+0

Sono disponibili ulteriori informazioni sull'eccezione? Forse anche qualche codice sorgente? – BonanzaOne

risposta

11

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.

  1. Aprire la finestra di dialogo 'Eccezioni' (menu Debug/eccezioni)
  2. pulsante 'Aggiungi ...', selezionare 'Eccezioni Common Language Runtime' come tipo.
  3. Impostare il nome dell'eccezione su "System.Data.SqlServerCe.SqlCeException"
  4. Convalidare e mantenere aperta la finestra di dialogo "Eccezioni".
  5. Aprire la sezione "Eccezioni di runtime in linguaggio comune" nell'elenco.
  6. 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:

  1. Individuare e fare una copia della DLL del MiniProfiler (dal cartella bin del progetto). Ovviamente, non fare una copia dei file pdb.
  2. Rimuovi tutti i riferimenti NuGet a MiniProfiler.
  3. 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.

+0

I Usiamo 'MSSQL' come memoria del database.Se deselezionate quella casella, non si fermano tutte le altre eccezioni' SqlCeException' che vengono generate? – Quoter

+0

Suppongo che intendiate usare il server Sql. dovrebbe deselezionare 'System.Data.SqlClient.SqlException' (sotto' System.Data.SqlClient'). Questo non impedirà il lancio delle eccezioni, questo istruirà semplicemente il debugger a non interrompersi quando vengono lanciati. –

+10

Ho aggiunto un Post Build Event to rimuovere il PDB e sembra funzionare bene: 'del" $ (TargetDir) MiniProfiler.pdb "/ q/s' – jrummell

Problemi correlati