Est-il possible d’intercepter une action READ?

Dans Entity Framework Core, vous pouvez remplacer la méthode SaveChanges / SaveChangesAsync dans DbContext et en fonction de différents états, tels que: EntityState.Added ou EntityState.Modified ou EntityState.Deleted , vous pouvez créer une solution d’audit EntityState.Modified EntityState.Deleted moment et par qui. enregistrements. Vous pouvez enregistrer l’état de l’entité avant et après l’action. Tout va bien ici, parfait!

Pouvons-nous faire quelque chose de similaire pour les actions de lecture / requête / sélection / visualisation?

J’ai creusé un peu et constaté que l’exécution réelle d’ IQueryable est effectuée par EntityQueryProvider : IAsyncQueryProvider, IQueryProvider .

Alors … vous remplacez le EntityQueryProvider par défaut pour effectuer la journalisation:

  public class LoggingQueryProvider : EntityQueryProvider { public LoggingQueryProvider(IQueryComstackr queryComstackr) : base(queryComstackr) { } public override object Execute(Expression expression) { var result = base.Execute(expression); //log return result; } public override TResult Execute(Expression expression) { var result = base.Execute(expression); //log return result; } public override IAsyncEnumerable ExecuteAsync(Expression expression) { var result = base.ExecuteAsync(expression); //log return result; } public override Task ExecuteAsync(Expression expression, CancellationToken cancellationToken) { var result = base.ExecuteAsync(expression, cancellationToken); //log return result; } } 

et vous l’enregistrez lors de la configuration de DbContext dans StartUp.ConfigureServices(IServiceCollection services)

  services.AddDbContext(builder => builder .UseSqlServer(Configuration["TryDBConnectionSsortingng"]) .ReplaceService() ); 

Ce n’est pas tout à fait simple, mais vous devriez pouvoir obtenir des informations à partir de l’expression, comme le type d’entité, et vous avez évidemment access au résultat réel. Les choses semblent un peu plus compliquées pour les méthodes asynchrones, mais …

La plupart des stratégies reposent sur le SaveChanges() pour auditer des données, mais vous pouvez également accéder à d’autres données en redéfinissant également la méthode Dispose() .

Lorsque des données de la firebase database sont interrogées, elles sont ajoutées au dbContext. Si elles sont lues mais non modifiées, elles doivent avoir EntityState.Unchanged .

En supposant que l’étendue DbContext style d’application Web typique d’une nouvelle instance par requête, une requête par ID signifie qu’il y avait une seule entrée dans ChangeTracker avec cet état lorsque DbContext est supprimé.

Vous pouvez essayer quelque chose comme ça:

 public override void Dispose() { var unchanged = ChangeTracker.Ensortinges() .Where(x => x.EntityState == EntityState.Unchanged); // log your unchanged ensortinges here base.Dispose(); } 

Ce n’est pas totalement infaillible, car vous pouvez extraire des données de certaines tables lors de la validation lors d’un processus de création / mise à jour, ou partager un contexte sur plusieurs référentiels, vous devez donc déterminer quelles entités doivent être auditées avec soin et quels modèles d’access vous utilisez

Je suggérerais de vous connecter à un niveau supérieur. Par exemple, si vous utilisez WebApi, vous pouvez vous connecter au niveau du pipeline OWIN, enregistrant ainsi les demandes d’informations.
En vous connectant plus bas, vous finissez par deviner et réitérer des données qui sont laides et finiront par consortingbuer à des inefficacités.