1

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

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是否可以以某种方式覆盖它,它通过自定义异常传输上下文类型?

4

1 回答 1

2

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

  1. 在过滤器中捕获DbUpdateException

  2. 现在在这个异常中,您可以通过访问属性找到失败的实体DbUpdateException.Entries

  3. 如此处所述,在过滤器中创建两个实体列表

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

我还没有尝试过,但在我看来它会起作用。

不幸的是,DBContext 在此处抛出以下Check MSDN之一。SQL exception连接问题与 DBContext 无关,因此不能关联到一个。

您可能会通过服务器SQL Exception 获取服务器名称进行关联,该名称也可能在DBContext 连接字符串中

于 2019-12-20T09:59:49.283 回答