在这种情况下,我希望通过登录的用户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));
}
}
每个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)
);
}