Sto cercando di capire come utilizzare Entity Framework Cores 2.1, il nuovo evento ChangeTracker.Tracked per collegarsi alle query di lettura. Sfortunatamente, non sono in grado di capire come implementarlo. Poiché si tratta di una nuova funzione, non è possibile trovare articoli su di essa e il sito ufficiale Microsoft docs non fornisce alcun aiuto o codice di esempio. Il mio scenario è piuttosto semplice. Ho un database con le seguenti colonne: id, customerId, metadati. Quando un utente esegue una query su questa tabella, desidero intercettare il set di risultati della query e per ogni riga, voglio confrontare il cliente con l'utente attualmente connesso. Spero che ChangeTracker.Tracked Event possa aiutarmi a intercettare il set di risultati di ritorno. Sto cercando un codice di esempio su come ottenere sopra.
Ecco un esempio di utilizzo dell'evento ChangeTracker.Tracked
.
Aggiungi il seguente metodo al tuo contesto (richiede l' using Microsoft.EntityFrameworkCore.ChangeTracking;
):
void OnEntityTracked(object sender, EntityTrackedEventArgs e)
{
if (e.FromQuery && e.Entry.Entity is YourEntityClass)
{
var entity = (YourEntityClass)e.Entry.Entity;
bool isCurrentUser = entity.customerId == CurrentUserId;
// do something (not sure what)
}
}
e collegalo a ChangeTracker.Tracked
anche nel tuo costruttore di contesto:
ChangeTracker.Tracked += OnEntityTracked;
Come descritto nella documentazione dell'evento Tracked
:
Un evento attivato quando un'entità viene tracciata dal contesto, sia perché è stata restituita da una query di tracciamento, sia perché è stata allegata o aggiunta al contesto.
Alcune cose da menzionare.
L'evento non viene attivato per le query senza tracciamento
L'evento viene generato per ogni istanza dell'entità creata dal set di risultati della query di tracciamento e non già tracciata dal contesto
La proprietà bool FromQuery
di bool FromQuery
evento viene utilizzata per distinguere se l'evento viene generato dal processo di materializzazione della query di tracciamento o tramite il codice utente ( Attach
, Add
, ecc.).
La proprietà EntityEntry Entry
evento consente di accedere all'istanza dell'entità e ad altre informazioni correlate (in pratica le stesse informazioni DbContext.Entry
quando si chiama il metodo DbContext.Entry
non generico)