gpt4 book ai didi

c# - 在导航属性上使用 EF Core HasQueryFilter

转载 作者:太空狗 更新时间:2023-10-30 00:17:58 24 4
gpt4 key购买 nike

我正在尝试对我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com