Sto provando a registrare lo sql che viene inviato al database dal framework Entity, ma che non ha un'enorme quantità di fortuna. Sto lavorando il codice prima al nuovo flusso di lavoro del database, ma mentre aggiungo proprietà al mio DbContext ottengo un errore Oracle dal database - identificatore troppo lungo. Mi piacerebbe guardare lo sql che viene inviato al database per identificare come sta cercando di creare le mie tabelle e vedere quale nome identificativo è troppo lungo.
Attualmente ho il seguente posto, ma non sembra mai essere chiamato mentre il codice è in esecuzione. So che i dati vengono inviati al database perché ottengo un'eccezione, ma il logger non viene mai eseguito. C'è qualcosa di davvero strano qui. È quasi come se il 99% delle volte, gli intercettori non funzionassero.
public class DBLog
{
private string path = @"C:\users\myuser\desktop\oracleloggingtest1.txt";
public void Log(string message)
{
File.AppendAllText(path, message);
}
}
...
...
DBLog lggr = new DBLog();
Database.SetInitializer(new DropCreateDatabaseAlways<TestDbContext>());
using (var context = new TestClearPersonModel())
{
context.Database.Log = s => lggr.Log(s);
context.WorkAffiliations.Add(personReportResult.WorkAffiliations);
...
context.SaveChanges();
}
Un'eccezione da entityframework viene generata sulla linea context.workaffiliations.add da Oracle perché uno degli identificatori è troppo lungo, ma nessuna di queste informazioni viene registrata.
Ad un certo punto, l'altro giorno in cui stavo scherzando, il logging ha funzionato perché ho un file di log di un paio di giorni fa sul mio desktop con alcuni vecchi dati al suo interno. Non riesco proprio a capire perché attualmente non funzioni. Ho provato alcuni metodi diversi ora per ottenere questi dati.
Qualsiasi aiuto è apprezzato!
EDIT: alcuni interessanti sviluppi nel tentativo di suggerire Tipx ... Ho cercato tutta la notte di essere in grado di registrare i comandi sql che stanno andando al database usando metodi diversi. Ho avuto il metodo di cui sopra, ho avuto un setup IDbCommandInterceptor registrato a livello di programmazione da una chiamata di funzione prima che le operazioni db inizino, e poi ho questo nella mia configurazione app nella sezione entityframework:
<interceptors>
<interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
<parameters>
<parameter value="C:\users\myuser\desktop\orclogtst.txt" />
</parameters>
</interceptor>
</interceptors>
Nessuno di questo codice è stato in esecuzione. Ho avuto punti di rottura su ogni diverso meccanismo di registrazione che ho provato e non sono mai stati chiamati. Ho provato dozzine e dozzine di volte con piccole modifiche qua e là. Dopo aver apportato una piccola modifica raccomandata da Tipx (solo cercando di accedere alla console), improvvisamente funzionarono entrambi gli altri meccanismi di registrazione. Ho colpito il punto di interruzione nel mio IDbCommandInterceptor che ha registrato i dati, e si scopre che l'intercettatore dal file web.config ha anche registrato i dati nel file specificato lì ....
Ma questo ha funzionato solo su quella esecuzione. Ho subito provato a rieseguire il mio codice (senza modificare nulla) e non funzionava più. Ho annullato le modifiche al codice, compilato, quindi ho aggiunto di nuovo le modifiche raccomandate da Tipx e ancora non ha funzionato. Cosa potrebbe causare l'improvvisamente chiamata di questi metodi senza modifiche al codice e non essere richiamati da allora?
Cancellare i risultati del database nella registrazione funziona normalmente. Se provo a eseguire il mio codice senza cancellare prima il database, la registrazione non funziona. Sospetto che ciò stia accadendo nel bel mezzo del tentativo di generare le mie tabelle di database dalle mie classi di modelli, piuttosto che alcune normali operazioni di crudismo.
Non penso che abbia a che fare con il provider. Il file potrebbe essere aperto / bloccato o le autorizzazioni potrebbero fare qualcosa.
Ecco cosa farei per scoprire qual è il problema:
Rimuovere il context.Database.Log = s => lggr.Log(s);
linea, e nel tuo costruttore di contesto, aggiungi questo:
Database.Log = (s) => { Console.WriteLine(s); };
E poi metti un breakpoint su Console.WriteLine
, esegui il programma e vedi se lo colpisci. Se lo fai, sai che non ha nulla a che fare con il provider. In caso contrario, ricontrolla il context
classe.
Inoltre, in un sidenote: dovresti esaminare l'uso di un framework di registrazione come NLog o Log4Net. La prima volta potrebbe impiegare mezz'ora per farlo funzionare, ma ne vale la pena. Inoltre, ho personalmente impostato i taglialegna nella classe stessa; la classe che usa il contesto non dovrebbe dire al tuo contesto di registrarsi, non è affare suo! :-P