- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试对我的 Multi-Tenancy 查询应用过滤器,但当属性是导航属性的一部分时它不允许我应用过滤器:
modelBuilder.Entity<Level>().HasQueryFilter(lvl => lvl.SchoolYear.TenantId == _tenantProvider.TenantId);
在这里,Level 是我要过滤的属性,但用于过滤的属性 TenantId 位于 Level.SchoolYear 中。
如果它是一个顶级属性,它就可以正常工作。当我需要过滤的属性是导航属性时,如何应用全局过滤器?
最佳答案
如前所述,这些模型级过滤器尚未(尚未)针对导航属性实现。这是可悲的,因为人们可能没有意识到这个限制并在 Multi-Tenancy 架构中依赖它。人人都知道,在 Multi-Tenancy 应用程序中犯错误可能会导致您公司的死亡,因此正确执行此操作非常重要。
一旦您选择了通过 TenantId
进行租户分离(而不是更安全的 schema-per-tenant 或 database-per-tenant),并且了解 EF-core 中的当前限制,您可以希望建立一个安全措施,至少您在保存更改时永远不会混淆租户数据。
可以通过定义接口(interface)来实现此保护措施:
public interface IHasTenantId
{
int TenantId { get; }
}
... 由具有 TenantId
的每个实体实现。
然后在 DbContext
子类中重写 SaveChanges
可以检查更改集中的所有 TenantId
是否相同:
public override int SaveChanges()
{
var distinctTenantIdsCount = this.ChangeTracker.Entries<IHasTenantId>()
.Select(e => e.Entity.TenantId)
.Distinct().Count();
if(distinctTenantIdsCount > 1)
{
// Throw an exception and handle it.
}
return base.SaveChanges();
}
关于c# - 在导航属性上使用 EF Core HasQueryFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47484046/
我正在使用 EF Core HasQueryFilter 扩展方法,它位于 OnModelCreating 方法中。 我正在使用服务将用户 ID 注入(inject) DbContext,然后将 us
我正在尝试对我的 Multi-Tenancy 查询应用过滤器,但当属性是导航属性的一部分时它不允许我应用过滤器: modelBuilder.Entity().HasQueryFilter(lvl =>
如果 HasQueryFilter 我有点困惑方法应该适用于由 Include() 加入的实体。方法。 从这篇(旧)文章中,他们陈述了以下内容: https://blogs.msdn.microsof
有没有办法将 HasQueryFilter() 全局应用到我的所有实体?我不想在 ModelBuilder 中一一添加。 modelBuilder.Entity().HasQueryFilter(p
我尝试在 OnModelCreating 方法(Entity Framework Core)中为具有 ClientId 属性 (int) 的所有实体应用查询过滤器。到目前为止,我能够过滤实体,但我很难
我是一名优秀的程序员,十分优秀!