提问者:小点点

按用户ID的EF核心全局筛选器查询


在这种情况下,我希望通过登录的用户ID或确切地说,某个名为AllowedVehicles的字段来筛选表。问题是,identityContext只有在登录时才填充字段AllowedVehicles,之后才是从数据库实际读取的AllowedVehicles属性。我的代码不起作用,因为执行了AllowedVehicles一次,即OnModelCreating时,它是空列表,并且只执行一次。

在这种情况下,如何进行全局筛选查询。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyGlobalFilters<IBaseEntity>(x => x.DeletedAt == null);
    if (_identityContext != null && _identityContext.AllowedVehicles.Count() > 0)
    {
        modelBuilder.ApplyGlobalFilters<Vehicle>(x => _identityContext.AllowedVehicles.Select(x => x.Id).Contains(x.Id));
    }
}

共1个答案

匿名用户

每个DbContext类只调用一次OnModelCreating。您不必期望有条件地应用过滤器。

一种解决方案是在筛选器中定义您的条件:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyGlobalFilters<IBaseEntity>(x => x.DeletedAt == null);

    modelBuilder.ApplyGlobalFilters<Vehicle>(x => _identityContext == null 
        || !_identityContext.AllowedVehicles.Any() 
        || _identityContext.AllowedVehicles.Select(x => x.Id).Contains(x.Id)
    );
}