Sto provando a catturare tutte le SQLExceptions (errore di connessione, timeout, ecc.) Che EF potrebbe lanciare in una singola posizione. Sto usando un'unità di pattern di lavoro con DI quindi non c'è var using = context
per esempio. Chiamate come .Single
o .ToList
sono utilizzate tutto intorno alla logica di business.
C'è qualche aggancio o evento di classe che potrei sovrascrivere o iniettare per fare questo?
Un po 'di lavoro da fare, ma questo ti aiuterà a pensare:
Incapsula DbContext
un finto contesto e nascondi i tuoi DbSets
. Costruisci un nuovo contesto che sarà il contesto per te logica aziendale. Questo non dà accesso ai DbSets
, mostra i dbSet personalizzati all'utente. Il lavoro principale sarà quello di costruire il contesto falso, che deve avere tutti i metodi che stai usando sui dbSet reali.
/// <summary>
/// This sould no be used anywhere except in MyDbContext2
/// </summary>
public class MyDbContext : DbContext
{
public DbSet<SomeTableClass> SomeTable { get; set; }
}
/// <summary>
/// This will be your context in the business-logic
/// </summary>
public class MyDbContext2
{
private MyDbContext realDb;
public MyDbContext2(string conStr)
{
realDb = new MyDbContext();
}
public MyDbSet<SomeTableClass> SomeFakeTable { get; set; }
}
/// <summary>
/// Fake-set with logging
/// </summary>
/// <typeparam name="T"></typeparam>
public class MyDbSet<T> where T : class
{
private DbSet<T> dbSet;
public MyDbSet(DbSet<T> realDbSet)
{
this.dbSet = realDbSet;
}
public List<T> ToList()
{
try
{
return dbSet.ToList();
}
catch (Exception e)
{
// Do some logging..
throw;
}
}
public T SingleOrDefault()
{
try
{
return dbSet.SingleOrDefault();
}
catch (Exception e)
{
// Do some logging..
throw;
}
}
}
Una buona idea sarebbe quella di rinominare DbContext
e introdurre una falsa con il vecchio nome. In questo modo Visual Studio ti mostrerà quali metodi devi implementare.