El filtro de consulta EF Core 2.0.0 está almacenando en caché TenantId (actualizado para 2.0.1+)

Estoy creando una aplicación multiinquilino y me encuentro con dificultades con lo que creo que es EF Core almacenando en caché la identificación del inquilino en las solicitudes. Lo único que parece ayudar es reconstruir constantemente la aplicación a medida que inicio sesión y salgo de los inquilinos.

Pensé que podría tener algo que ver con elIHttpContextAccessor la instancia es un singleton, pero no se puede determinar, y cuando inicio y cierre sesión sin reconstruir puedo ver el cambio del nombre del inquilino en la parte superior de la página, por lo que no es el problema.

Lo único que puedo pensar es que EF Core está haciendo algún tipo de almacenamiento en caché de consultas. No estoy seguro de por qué consideraría que se trata de una instancia de ámbito y debería estar reconstruyéndose en cada solicitud, a menos que me equivoque, lo que probablemente sí. Esperaba que se comportara como una instancia de ámbito para poder simplemente inyectar la identificación del inquilino en el momento de la compilación del modelo en cada instancia.

Realmente agradecería si alguien pudiera señalarme en la dirección correcta. Aquí está mi código actual:

TenantProvider.cs

public sealed class TenantProvider :
    ITenantProvider {
    private readonly IHttpContextAccessor _accessor;

    public TenantProvider(
        IHttpContextAccessor accessor) {
        _accessor = accessor;
    }

    public int GetId() {
        return _accessor.HttpContext.User.GetTenantId();
    }
}

... que se inyecta enTenantEntityConfigurationBase.cs donde lo uso para configurar un filtro de consulta global.

internal abstract class TenantEntityConfigurationBase<TEntity, TKey> :
    EntityConfigurationBase<TEntity, TKey>
    where TEntity : TenantEntityBase<TKey>
    where TKey : IEquatable<TKey> {
    protected readonly ITenantProvider TenantProvider;

    protected TenantEntityConfigurationBase(
        string table,
        string schema,
        ITenantProvider tenantProvider) :
        base(table, schema) {
        TenantProvider = tenantProvider;
    }

    protected override void ConfigureFilters(
        EntityTypeBuilder<TEntity> builder) {
        base.ConfigureFilters(builder);

        builder.HasQueryFilter(
            e => e.TenantId == TenantProvider.GetId());
    }

    protected override void ConfigureRelationships(
        EntityTypeBuilder<TEntity> builder) {
        base.ConfigureRelationships(builder);

        builder.HasOne(
            t => t.Tenant).WithMany().HasForeignKey(
            k => k.TenantId);
    }
}

... que luego es heredado por todas las demás configuraciones de entidad de inquilino. Lamentablemente, no parece funcionar como lo había planeado.

Verifiqué que la identificación del inquilino que devuelve el principal del usuario está cambiando dependiendo del usuario que haya iniciado sesión, por lo que ese no es el problema. ¡Gracias de antemano por cualquier ayuda!

Actualizar

Para obtener una solución cuando use EF Core 2.0.1+, mire la respuesta no aceptada de mí.

Actualización 2

Observe también la actualización de Ivan para 2.0.1+, que representa en la expresión de filtro del DbContext que restaura la capacidad de definirla una vez en una clase de configuración base. Ambas soluciones tienen sus pros y sus contras. He optado por Ivan nuevamente porque solo quiero aprovechar mis configuraciones básicas tanto como sea posible.

Respuestas a la pregunta(2)

Su respuesta a la pregunta