Entity Framework and Log4Net

Da molti anni uso Log4Net come strumento di log per le mie applicazioni ora è venuto il momento di integrare il tutto anche con Entity Framework ma come fare ? Mi sono detto, mi piacerebbe molto tenere traccia delle query che genero con Entity, certo il Profiler "SEMPRE ATTIVO" come il Master raccomanda, ma un log delle query in molti casi ti salva la 'vita'.

Lasciando perdere la configurazione di Log4net log4net Manual - Configuration che potete trovare in ogni dove sul web, concentriamoci su come Entity deve essere configurato per il risultato voluto.

Entity ci fornisce questo bel metodo ObjectQuery.ToTraceString per monitorare la query che verrà generata al momento della chiamata. Siamo a cavallo quindi, vediamo alcuni esempi di utilizzo.

EntityCommand.ToTraceString()

   1: var _context = new AdventureWorksEntities();
   2:  
   3: var connection = new EntityConnection(_context.Connection.ConnectionString); 
   4:  
   5: var query = "SELECT VALUE pro FROM AdventureWorksEntities.Product AS pro " +
   6:                       "WHERE pro.Color = @color"; 
   7:  
   8: var cmd = new EntityCommand(query, connection);
   9:  
  10: var param = new EntityParameter("color", DbType.String) {Value = "Black"};
  11: cmd.Parameters.Add(param); 
  12:  
  13: if (cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open();
  14: _log.Debug(cmd.ToTraceString());

ObjectQuery.ToTraceString()

   1: var sql = "SELECT VALUE pro FROM AdventureWorksEntities.Product AS pro " + 
   2:                        "WHERE pro.Color = @color"; 
   3:  
   4: var query = _context.CreateQuery<Product>(sql); 
   5: query.Parameters.Add(new ObjectParameter("color", "Black")); 
   6:  
   7: if (_context.Connection.State != ConnectionState.Open) _context.Connection.Open(); 
   8: _log.Debug(query.ToTraceString());

LINQ to Entities

   1: string color = "Black";
   2: var query = from e in _context.Product
   3:             where e.Color == color
   4:             select e;
   5:  
   6: if (_context.Connection.State != ConnectionState.Open) _context.Connection.Open();
   7: _log.Debug((query as ObjectQuery<Product>).ToTraceString());

facile no?!?! che ne dite?