我需要对我的实体应用全局过滤器。我已经在OnModelCreating中实现了此功能,其中筛选是根据正确登录的用户完成的。由于OnModelCreating仅被调用一次,因此,如果登录用户的某些属性在运行时发生更改,则必须确保正确更新了应用于DbSets类型的筛选器。如何按需调用OnModelCreating?或者,是否有其他解决方法而不会造成性能损失,例如,由于在模型构建器上删除了EF缓存?
查询过滤器通过以下扩展方法应用:https://gist.github.com/alirizaadiyahsi/bede89ba3d301f151a13bc58908a61ac
我的CustomDbContext公开了从OnModelCreating方法内部调用的委托,并且该委托由我的访问层业务类初始化。
以下是示例代码:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
// Invoke delegate where my BusinessAccessLayer will perform filter operations
this.OnModelCreatingHandler?.Invoke(modelBuilder);
}
// My Business logic
private MyLoggedUser { get; private set; }
void OnModelCreatingHandlerMethod(ModelBuilder modelBuilder)
{
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
if (typeof(IEntity).IsAssignableFrom(entityType.ClrType))
modelBuilder.Entity(entityType.ClrType).AddQueryFilter<IEntity>(e => e.SomeProperty > MyLoggedUser.SomeValue);
}
}