是否可以拦截READ动作? [英] Is it possible to intercept a READ action?

查看:56
本文介绍了是否可以拦截READ动作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Entity Framework Core中,您可以在 DbContext中重写 SaveChanges / SaveChangesAsync 方法并基于以下不同状态: EntityState.Added EntityState.Modified EntityState.Deleted ,您可以创建一些有关何时何人创建,修改或删除某些记录的审核解决方案。您可以在操作之前和之后保存实体的状态。一切都很好,这里完​​美!

In Entity Framework Core, you can override SaveChanges/SaveChangesAsync method in the DbContext and based on different states like: EntityState.Added or EntityState.Modified or EntityState.Deleted, you can create some Audit solution about when and whom created, modified or deleted certain records. You can save the state of the entity before and after the action. All good here works perfect!

我们可以对读取/查询/选择/查看操作执行类似的操作吗?

Can we do something similar for read/query/select/view actions?

推荐答案

我挖了一点,发现 IQueryable 的实际执行是由 EntityQueryProvider进行的:IAsyncQueryProvider,IQueryProvider

I dug a little and found that the actual execution of the IQueryable is done by EntityQueryProvider : IAsyncQueryProvider, IQueryProvider.

因此...您覆盖默认的 EntityQueryProvider 进行日志记录:

So... you override the default EntityQueryProvider to do the logging:

   public class LoggingQueryProvider : EntityQueryProvider
    {
        public LoggingQueryProvider(IQueryCompiler queryCompiler) : base(queryCompiler) { }

        public override object Execute(Expression expression)
        {
            var result = base.Execute(expression);
            //log
            return result;
        }
        public override TResult Execute<TResult>(Expression expression)
        {
            var result = base.Execute<TResult>(expression);
            //log
            return result;
        }
        public override IAsyncEnumerable<TResult> ExecuteAsync<TResult>(Expression expression)
        {
            var result = base.ExecuteAsync<TResult>(expression);
            //log
            return result;
        }
        public override Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken)
        {
            var result = base.ExecuteAsync<TResult>(expression, cancellationToken);
            //log
            return result;
        }
    }

,并在<$ c中配置DbContext时进行注册$ c> StartUp.ConfigureServices(IServiceCollection服务)

    services.AddDbContext<XPContext>(builder =>
        builder
        .UseSqlServer(Configuration["TryDBConnectionString"])
        .ReplaceService<IAsyncQueryProvider, LoggingQueryProvider>()
    );

不是很简单,但是您应该能够从表达式中获取一些信息,例如实体类型,您显然可以访问实际结果。对于异步方法来说,事情看起来有些复杂,但是...

It's not quite straight forward, but you should be able to get some information from the expression, like the entity type, and you obviously have access to the actual result. Things look a bit more complicated for the async methods, but...

这篇关于是否可以拦截READ动作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆