C'è un modo per applicare "HasQueryFilter" globaly a tutta la mia entità? Non voglio aggiungere il modelbuilder uno per uno?
modelBuilder.Entity<Manufacturer>().HasQueryFilter(p => p.IsActive);
Nel caso in cui si abbia una classe base o un'interfaccia che definisce la proprietà IsActive
, è possibile utilizzare l'approccio Filtra tutte le query (cercando di ottenere l'eliminazione graduale ) .
Altrimenti potresti iterare i tipi di entità, e per ogni tipo con bool IsActive
proprietà bool IsActive
in modo dinamico il filtro dell'espressione usando i metodi della classe Expression
:
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
var isActiveProperty = entityType.FindProperty("IsActive");
if (isActiveProperty != null && isActiveProperty.ClrType == typeof(bool))
{
var parameter = Expression.Parameter(entityType.ClrType, "p");
var filter = Expression.Lambda(Expression.Property(parameter, isActiveProperty.PropertyInfo), parameter);
entityType.QueryFilter = filter;
}
}
Aggiornamento (EF Core 3.0): a causa della modifica della rottura dell'API dei metadati pubblici (sostituzione di molte proprietà con i metodi di estensione Get
/ Set
), l'ultima riga diventa
entityType.SetQueryFilter(filter);