Sto usando Entity Framework 6 in C # e ho implementato la mia classe di DatabaseLogFormatter
per essere in grado di formattare ciò che esce dal log.
Vorrei aggiungere ulteriori dettagli al log il tipo di oggetto TEntity che ha eseguito l'SQL (utilizzando la procedura DbSqlQuery<TEntity> SqlQuery(string sql, params object[] parameters)
). Quindi, se avessi un'entità chiamata staff
e chiamata staff.SqlQuery
potrei nel LogCommand()
estrarre che era lo staff
che chiamava SQL. Potrei quindi inserire una riga nel mio registro Entity "staff" executed the command...
Metti un po 'di codice per quello che hai finora. Non è chiaro dalla procedura di esempio dato che non era un metodo di estensione. Indovina se desideri un metodo di estensione eseguito su un DbSet<TEntity>
...
public static class DbSetExtensions
{
public static DbSqlQuery<TEntity> SqlQuery<TEntity>(this DbSet<TEntity> dbSet, string sql, params object[] parameters) where TEntity : class
{
// Do stuff with dbSet...
Logger.Instance.Write(string.Replace("Entity \"{0}\" executed the command...", typeof(TEntity).Name));
}
}
chiamare il codice sarebbe qualcosa di simile:
using( var context = new myDbContext())
{
var query = context.Orders.SqlQuery(sql);
// ...
var results = query.ToList();
}
Come metodo statico, per accedere a un logger è necessario risolverlo come classe statica o Singleton statico. In alternativa, per estrarre semplicemente il nome di un DbSet da utilizzare in un metodo di repository non statico o simile:
public static class DbSetExtensions
{
public static string EntityName<TEntity>(this DbSet<TEntity> dbSet) where TEntity : class
{
return typeof(TEntity).Name;
}
}
Anche se senza codice, è un po 'difficile indovinare come intendevi che il metodo SqlQuery funzionasse ...