gpt4 book ai didi

c# - 基于接口(interface)的全局过滤器

转载 作者:行者123 更新时间:2023-11-30 14:22:19 24 4
gpt4 key购买 nike

是否可以将下面的内容写在一行中?

//Create a Global Filter for the TenantId property.
modelBuilder.Entity<Item>().HasQueryFilter(b => EF.Property<int>(b, "TenantId") == this._appUserProvider.CurrentTenantId);
modelBuilder.Entity<Invite>().HasQueryFilter(b => EF.Property<int>(b, "TenantId") == this._appUserProvider.CurrentTenantId);

我已经尝试过 Item 和 Invite 的接口(interface),但是 EF 抛出了一个错误,指出它必须是引用类型。

我也尝试了一个基类,但我不想更改似乎需要它才能工作的基表。

还有其他选择吗?

最佳答案

假设您的实体实现了以下接口(interface):

public interface ITenantEntity
{
int TenantId { get; set; }
}

使用通用代码通过流畅的 API 配置多个实体时,最重要的是在调用 modelBuilder.Entity<TEntity>() 时使用真实的实体类型。 .使用基类会引入 EF 继承,接口(interface)只会产生异常。

IMO 最简单的解决方案是将通用代码放在通用方法中并通过反射调用它。

首先在派生的 DbContext 中创建一个受约束的通用实例方法包含所需流畅配置的类:

void ConfigureTenantFilter<TEntity>(ModelBuilder modelBuilder)
where TEntity : class, ITenantEntity
{
modelBuilder.Entity<TEntity>()
.HasQueryFilter(e => e.TenantId == this._appUserProvider.CurrentTenantId);
}

然后在 OnModelCreating 末尾使用以下代码片段覆盖(在发现所有实体类型之后):

var configureTenantMethod = GetType().GetTypeInfo().DeclaredMethods.Single(m => m.Name == nameof(ConfigureTenantFilter));
var args = new object[] { modelBuilder };
var tenantEntityTypes = modelBuilder.Model.GetEntityTypes()
.Where(t => typeof(ITenantEntity).IsAssignableFrom(t.ClrType));
foreach (var entityType in tenantEntityTypes)
configureTenantMethod.MakeGenericMethod(entityType.ClrType).Invoke(this, args);

关于c# - 基于接口(interface)的全局过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50330348/

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