如何只将IDbCommandInterceptor挂钩到特定类型的DbContext?

时间:2016-11-02 14:08:00

标签: c# entity-framework logging entity-framework-6 interceptor

目前,我正通过DbInterceptionIDbCommandInterceptor的实施内容添加到静态DbConfiguration课程中:

public class LogDbConfiguration : DbConfiguration
{
    public LogDbConfiguration()
    {
        if (AppConfig.LogDebugLevel > LogDebugLevel.Nothing)
        {
            DbInterception.Add(new PerformanceLogDbCommandInterceptor());
        }
    }
}

这个配置被添加到我想要挂钩的上下文中,作为属性:

[DbConfigurationType(typeof(LogDbConfiguration))]
public partial class MyEntityFrameworkDb // : DbContext
{
    ...
}

但是这会将IDbCommandInterceptor挂钩到所有DbContexts,所以我必须检查我来自哪个上下文:

public class PerformanceLogDbCommandInterceptor : IDbCommandInterceptor
{
    ...
    public void NonQueryExecuted(DbCommand command,
            DbCommandInterceptionContext<int> interceptionContext)
    {
        LogIfMyEntityFrameworkDbContext(command, interceptionContext);
    }
    ...
    private void LogIfMyEntityFrameworkDbContext<T>(DbCommand command,
            DbCommandInterceptionContext<T> interceptionContext)
    {
        ...
        //Log only to MyEntityFrameworkDb 
        if (!(interceptionContext.DbContexts.SingleOrDefault() is MyEntityFrameworkDb))
        {
            return;
        }
        ...
    }
}

我更愿意,如果我不必进行此类检查,并且只在特定上下文中将拦截器实现添加为观察者。我无法找到办法做到这一点。 MSDN's article on this说以下内容:

  

也可以使用基于DbConfiguration代码的配置机制在app-domain级别注册拦截器。

我不确定“app-domain level”是什么,但我认为这意味着与我目​​前所做的相同的范围/上下文。

有没有办法对Observer模式执行此操作 - 也就是说,将拦截器挂钩为特定类型的DbContext的侦听器?

0 个答案:

没有答案