public RepositoryException Translate(DbException exception, IDictionary <string, object> options = null)
        {
            Condition.Requires(exception, nameof(exception)).IsNotNull();
            Condition.Requires(options, nameof(options))
            .IsNotNull()
            .Evaluate(options.ContainsKey("EntityType"));
            var     entityType         = (Type)options["EntityType"];
            var     outerException     = options.ContainsKey("OuterException") ? (Exception)options["OuterException"] : exception;
            dynamic sqlServerException = exception;

            foreach (dynamic error in sqlServerException.Errors)
            {
                if (SqlServerErrorHelper.IsUnavailableError(error))
                {
                    return(new RepositoryUnavailableException(entityType, outerException));
                }

                if (SqlServerErrorHelper.IsUnauthorizedError(error))
                {
                    return(new RepositoryUnauthorizedException(entityType, outerException));
                }

                if (SqlServerErrorHelper.IsTimeoutError(error))
                {
                    return(new RepositoryTimeoutException(entityType, outerException));
                }
            }
            return(new RepositoryException(isTransient: false, entityType, outerException));
        }
        public QueryException Translate(DbException exception, IDictionary <string, object> options = null)
        {
            Condition.Requires(exception, nameof(exception)).IsNotNull();
            Condition.Requires(options, nameof(options))
            .IsNotNull()
            .Evaluate(options.ContainsKey("Query"));
            var     query = (IQuery)options["Query"];
            dynamic sqlServerException = exception;

            foreach (dynamic error in sqlServerException.Errors)
            {
                if (SqlServerErrorHelper.IsUnavailableError(error))
                {
                    return(new QueryUnavailableException(query, exception));
                }

                if (SqlServerErrorHelper.IsUnauthorizedError(error))
                {
                    return(new QueryUnauthorizedException(query, exception));
                }

                if (SqlServerErrorHelper.IsTimeoutError(error))
                {
                    return(new QueryTimeoutException(query, exception));
                }
            }
            return(new QueryException(isTransient: false, query, exception));
        }