在处理 SqlExcpetion 时查找特定的 DbContext

Find specific DbContext, when handling a SqlExcpetion

我想创建一个异常过滤器:

public class BigTouchExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        var sqlException = filterContext.Exception as SqlException;
        if (sqlException == null)
        {
            return;
        }
        //Todo: Handle when it is thrown by `BigTouchContext`
    }
}

我有两个不同的 DbContext:MainContext:DbContextBigTouchContext:DbContext。我想在我的 ExceptionFilter 中检测错误是否由 BigTouchContext(实际上是多个租户)抛出。

是否有可能以某种方式覆盖 DbContext,它通过自定义异常传输上下文类型?

我真的找不到从相关异常中获取 DBContext 的方法,但我可以提出一个解决方法

  1. 在您的过滤器中捕捉 DbUpdateException

  2. 现在在此异常中,您可以通过访问 DbUpdateException.Entries 属性

    找到失败的实体
  3. 按照所述在过滤器中创建两个实体列表

    var entityTypes = db.Model.GetEntityTypes().Select(t => t.ClrType).ToList();
  1. 获取第二步失败的第一个条目,并使用它公开的 GetType() 方法从两个列表中搜索类型。第一个得到它的是您选择的 DBContext。

我还没有尝试过,但我觉得它会奏效。

不幸的是,DBContext 抛出以下之一 Check MSDN hereSQL exception 连接问题与 DBContext 无关,因此无法与之关联。

您也许可以通过服务器进行关联 SQL Exception get server name which could also be in the DBContext connection string