Cómo refrescar EntityFramework core 5 modelo o caché de filtro de consulta?

Tengo este filtro de consulta en el inquilino:

m.Builder.HasQueryFilter(mm => EF.Property(mm, "TenantId") == SindikatDataSetBase.TenantId);

Cuando me inicio en una aplicación de escritorio como una variable estática de usuario diferente SindikatDataSetBase. TenantId cambia, pero el filtro de consulta sigue utilizando el valor anterior TenantId.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por geekglitcher


3 Respuestas:

  • Bueno, es malo usar variable estática. EF Core soporta variables en filtros si son parte de DbContext

    Crear propiedad en su DbContext Tenant Id e inicializa, por ejemplo en constructor o usando inicialización predeterminada.

    public class MyDbContext: DbContext
    {
       public int TenantId { get; set; } = SindikatDataSetBase.TenantId;
    
       protected override void OnModelCreating(ModelBuilder modelBuilder)
       {
          modelBuilder.Entity()
            .HasQueryFilter(mm => EF.Property(mm, "TenantId") == TenantId);
       }
    }
    

    Después de eso cada nuevo MyDbContext capturará su variable estática y EF puede crear una consulta correcta.

    UPDATE

    Cómo evitar configurar QueryFilter parametrizado dentro DbContext

    Idea es simple - imitación que ya estamos en el metod de DbContext.

    MyDbContext ctx = null;
    m.Builder.HasQueryFilter(mm => EF.Property(mm, "TenantId") == ctx.TenantId);
    

    Respondida el Dec 18, 2020 a las 12:00 - por pixelpioneer

    Votos positivos: 0 | Votos negativos: 0

  • Para refrescar el modelo o caché de filtro de consulta en Entity Framework Core 5, puedes intentar realizar lo siguiente:

    • Actualizar el valor de `SindikatDataSetBase.TenantId` antes de ejecutar la consulta en cada solicitud nueva.
    • Forzar al contexto de Entity Framework a recargar el modelo y aplicar el filtro de consulta actualizado cada vez que cambie el valor de `SindikatDataSetBase.TenantId`.

    Aquí tienes un ejemplo de cómo podrías implementar la opción 2:

    csharp
    using Microsoft.EntityFrameworkCore;
    
    public class TuDbContext : DbContext
    {
        // Definir DbSet y otras configuraciones aquí
    
        public DbSet TusEntidades { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            // Definir el filtro de consulta con el valor de TenantId actualizado dinámicamente
            modelBuilder.Entity().HasQueryFilter(e => EF.Property(e, "TenantId") == SindikatDataSetBase.TenantId);
        }
    
        public void RefreshQueryFilter()
        {
            // Marcar el modelo como no construido para forzar la reconfiguración
            Model.RemoveQueryFilter();
    
            // Volver a aplicar el filtro de consulta con el valor actualizado de TenantId
            Model.AddQueryFilter(e => EF.Property(e, "TenantId") == SindikatDataSetBase.TenantId);
        }
    }
    

    En la clase donde se modifica SindikatDataSetBase.TenantId, puedes llamar al método RefreshQueryFilter() antes de realizar consultas que requieran el filtro actualizado.

    Es importante tener en cuenta que forzar la recarga del filtro de consulta puede afectar al rendimiento de la aplicación, por lo que es recomendable evaluar el impacto antes de implementar esta solución en un entorno de producción.

    Respondida el Dec 19, 2020 a las 12:01 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para actualizar el filtro de consulta en Entity Framework Core 5 después de cambiar el valor de SindikatDataSetBase.TenantId, puedes utilizar el método HasQueryFilter con un nuevo predicado:

    
    using Microsoft.EntityFrameworkCore;
    
    var optionsBuilder = new DbContextOptionsBuilder();
    
    optionsBuilder.HasQueryFilter(mm => EF.Property(mm, "TenantId") == SindikatDataSetBase.TenantId);
    
    var contexto = new TuContexto(optionsBuilder.Options);
    
    // Actualizar TenantId
    SindikatDataSetBase.TenantId = nuevoValor;
    
    // Crear un nuevo DbContext con el filtro de consulta actualizado
    contexto = new TuContexto(optionsBuilder.Options);
    

    Esto creará un nuevo contexto de base de datos con el filtro de consulta actualizado. Asegúrate de disponer del contexto anterior antes de crear uno nuevo para liberar los recursos correctamente.

    Nota: Si estás utilizando el patrón de repositorio, asegúrate de inyectar el contexto actualizado en los repositorios para que utilicen el filtro de consulta correcto.

    Respondida el Dec 19, 2020 a las 12:07 - por Gemini

    Votos positivos: 0 | Votos negativos: 0