【问题标题】:LambdaExpression referencing private fieldLambdaExpression 引用私有字段
【发布时间】:2021-12-19 21:36:31
【问题描述】:

我打算通过 HasQueryFilter 在 EF CORE 中使用全局过滤器,像这样

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    var filter = _tenantFilterProvider.GetExpression();

    modelBuilder.Entity<MyEntity>()
        .HasQueryFilter(filter);
}

我的 lambda 表达式由一个名为 TenantFilterProvider 的类提供,该类具有一个返回 LambdaExpression 的简单方法。此 lambda 表达式引用在 TenantFilterProvider 中声明的私有字段

public class TenantFilterProvider
{
    private readonly CurrentTenant _currentTenant;

    public TenantFilterProvider(CurrentTenant currentTenant)
    {
        _currentTenant = currentTenant;
    }
    
    public LambdaExpression GetExpression()
    {
        Expression<Func<MyEntity, bool>> expression = entity => entity.TenantId == _currentTenant.TenantId;

        return expression;
    }
}

TenantFilterProvider 和 CurrentTenant 都在 aspnetcore 的内置依赖注入中注册为作用域。

lambda 将存储在 Ef Core 模型内的全局变量中,所以我担心引用字段的表达式(在本例中为 _currentTenant)。

这会造成任何类型的内存问题吗?比如内存泄漏?

如果提供的代码不够用,我将整个代码上传到这个仓库https://github.com/kewinbrand/EfCoreQueryFilter

【问题讨论】:

    标签: c# .net-core entity-framework-core


    【解决方案1】:

    TenantFilterProvider 和 CurrentTenant 都在 aspnetcore 的内置依赖注入中注册为作用域。

    这表明您希望每个请求都注入一个不同的 CurrentTenant 实例,对吧?

    由于 OnModelCreating 只被调用一次,这个表达式将捕获对第一次调用它的请求处于活动状态的 CurrentTenant,并在每个后续请求中使用同一个租户,我很确定这不是你的行为正在寻找。

    【讨论】:

    • 你是对的,在我的示例中,只有在创建模型时才会捕获 CurrenTenant.Id。如果使用 currentTenant 作为 DbContext 中的字段,则声明 lambda 是内联的,则情况并非如此。我不知道为什么,像这样 HasQueryFilter(entity => entity.TenantId == _currentTenant.TenantId);
    猜你喜欢
    • 1970-01-01
    • 2011-12-16
    • 2013-03-08
    • 1970-01-01
    • 2014-06-19
    • 2011-12-02
    • 2012-06-07
    • 2012-06-28
    • 2013-10-15
    相关资源
    最近更新 更多