Ultimamente lavoro praticamente sempre con
Entity Framework per tutti i progetti a cui metto mano, ed devo dire che sono pienamente soddisfatto.
I vantaggi sono moltissimi e risaputi, ma se dovessi scegliere un paio di cose veramente indispensabili, sicuramente sceglierei Lambda Expression per filtrare i dati, e il drastico ma veramente drastico abbattimento del tempo di sviluppo dello strato dati.
Ormai grazie a questo pacchetto diciamo pure che mi sono abituato fin troppo bene
...ma un buon sviluppatore sa bene che per quanto un prodotto sia bello e valido per un contesto, solo l'utilizzo nel tempo può dirci quanto sia veramente adattabile alle diverse situazioni...dato che si devono spesso fare acrobazie degne del Cirque du Soleil.
Infatti purtroppo ogni tanto mi capita di dover scrivere alcune query dritte senza usare Entity Framework, andando direttamente via sintassi Sql sul database.
Per casi come questo, magari avendo tutto già bello che configurato su EF, torna utile sapere il nome della tabella da poter usare nelle query che scrivo, anche nell'ottica di restare il più possibile agile.
Per questo ho preferito fare a meno di scrivere i nomi delle tabelle, ma farmi piuttosto un piccolo metodo che va nei metadati del Context, prende la stringa che genera EF (visibile anche in debug) e con Regex recuperare il nome della tabella:
public string GetNomeTabella()
{
var ctx = GetContext();
ObjectContext objectContext = ((IObjectContextAdapter)ctx).ObjectContext;
var x = objectContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.SSpace);
string sql = objectContext.CreateObjectSet<T>().ToTraceString();
Regex regex = new Regex("FROM (?<table>.*) AS");
Match match = regex.Match(sql);
return = match.Groups["table"].Value;
}
Il DbContext corrente è dato dal metodo "GetContext()" relativo alle mappature dell'entita che nel mio caso è implementato nel BaseProvider<T> spiegato in questo post, ma ovviamente può essere recuperato come meglio si crede.