在Entity Framework Core中,您可以基于和的不同状态覆盖SaveChanges
和SaveChangesAsync
中的/方法,DbContext
例如:EntityState.Added
或EntityState.Modified
或EntityState.Deleted
,您可以创建一些有关何时,何人创建,修改或删除某些记录的审核解决方案。您可以在操作之前和之后保存实体的状态。一切都很好,这里完美!
我们可以对读取/查询/选择/查看操作执行类似的操作吗?
我挖了一点,发现的实际执行IQueryable
是由完成的EntityQueryProvider : IAsyncQueryProvider, IQueryProvider
。
所以...您覆盖默认值EntityQueryProvider
以进行日志记录:
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;
}
}
并且您在配置DbContext时注册它 StartUp.ConfigureServices(IServiceCollection services)
services.AddDbContext<XPContext>(builder =>
builder
.UseSqlServer(Configuration["TryDBConnectionString"])
.ReplaceService<IAsyncQueryProvider, LoggingQueryProvider>()
);
这不是很简单,但是您应该能够从表达式中获取一些信息,例如实体类型,并且显然可以访问实际结果。对于异步方法来说,事情看起来有些复杂,但是...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句