相关疑难解决方法(0)

EF Core 2.0.0查询过滤器正在缓存TenantId(针对2.0.1+进行了更新)

我正在构建一个多租户应用程序,并且遇到了我认为EF Core在请求中缓存租户ID的困难.唯一似乎有帮助的是在我登录和退出租户时不断重建应用程序.

我认为它可能与IHttpContextAccessor实例是单例有关,但它不能作为范围,当我在没有重建的情况下登录和退出时,我可以看到租户的名称在页面顶部发生变化,所以它不是问题.

我能想到的另一件事是EF Core正在进行某种查询缓存.我不确定为什么它会考虑它是一个范围的实例,它应该在每个请求上重建,除非我错了,我可能是.我希望它的行为类似于作用域实例,因此我可以在模型构建时在每个实例上简单地注入租户ID.

如果有人能指出我正确的方向,我真的很感激.这是我目前的代码:

TenantProvider.cs

public sealed class TenantProvider :
    ITenantProvider {
    private readonly IHttpContextAccessor _accessor;

    public TenantProvider(
        IHttpContextAccessor accessor) {
        _accessor = accessor;
    }

    public int GetId() {
        return _accessor.HttpContext.User.GetTenantId();
    }
}
Run Code Online (Sandbox Code Playgroud)

...注入TenantEntityConfigurationBase.cs,我用它来设置全局查询过滤器.

internal abstract class TenantEntityConfigurationBase<TEntity, TKey> :
    EntityConfigurationBase<TEntity, TKey>
    where TEntity : TenantEntityBase<TKey>
    where TKey : IEquatable<TKey> {
    protected readonly ITenantProvider TenantProvider;

    protected TenantEntityConfigurationBase(
        string table,
        string schema,
        ITenantProvider tenantProvider) :
        base(table, schema) {
        TenantProvider = tenantProvider;
    }

    protected override void …
Run Code Online (Sandbox Code Playgroud)

c# caching multi-tenant entity-framework-core asp.net-core

7
推荐指数
1
解决办法
2115
查看次数

如何拦截SELECT查询

我正在探索实体框架7,我想知道是否有办法拦截"SELECT"查询.每次创建,更新或删除实体时,我都会使用当前日期和时间标记实体.

SELECT * 
FROM MyTable
WHERE DeletedOn IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

我希望我的所有SELECT查询都排除已删除的数据(请参阅上面的WHERE子句).有没有办法使用Entity Framework 7?

entity-framework entity-framework-core

5
推荐指数
1
解决办法
1116
查看次数

ef core 2 对所有实体应用 HasQueryFilter

有什么方法可以将“HasQueryFilter”全局应用于我的所有实体?我不想一一添加模型构建器?

modelBuilder.Entity<Manufacturer>().HasQueryFilter(p => p.IsActive);
Run Code Online (Sandbox Code Playgroud)

entity-framework entity-framework-core

4
推荐指数
1
解决办法
6147
查看次数

在C#中结合BinaryExpression和Expression &lt;Func &lt;dynamic,bool &gt;&gt;

如何结合BinaryExpressionExpression<Func<dynamic / T, bool>>

例如:

void AddGlobalFilter<T>(Expression<Func<T, bool>> expr)
{
    var parameter = Expression.Parameter(type, "t");
    var member = Expression.Property(filter.Parameter, field);
    var constant = Expression.Constant(null);
    var body = Expression.Equal(member, constant);

    var combine = Expression.AndAlso(body, expr);
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试为实体框架(EF)核心定义全局过滤器。问题是我必须手动组合多个过滤器

ModelBuilder如果模型实现IDbDeleted接口,则可以添加一个过滤器。
可以为特定模型手动添加另一个。基本思想是我拥有所有表达式的列表,然后将它们组合:

var expression = listExpressions.First();
foreach (var second in listExpressions.Skip(1))
{
    expression = Expression.AndAlso(expression, second);
}
var lambdaExpression = Expression.Lambda(expression, parameter);
modelBuilder.Entity(item.Key).HasQueryFilter(lambdaExpression);
Run Code Online (Sandbox Code Playgroud)

当然我得到了错误(第一个来自Expression.Equal,第二个来自t => t...):

过滤器表达式't => t …

c# lambda expression-trees entity-framework-core entity-framework-core-2.1

4
推荐指数
1
解决办法
714
查看次数

Entity Framework Core 2.0许多表中的公共属性的默认值

我正在做代码首次EF Core 2.0迁移.我有几列在所有实体中都很常见.所有实体都继承此类,如下所示.

如何将CreateDate的默认值设置为当前日期,将CreateBy设置为"System"并将IsDeleted设置为0?

public class BaseEntity
{
    public DateTime CreateDate { get; set; }

    public string CreateBy { get; set; }

    public bool IsDeleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我知道如何为一个属性做这个.即.

class MyContext : DbContext
{
    public DbSet<CaseDetails> CaseDetails{ get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<CaseDetail>()
            .Property(b => b.CreateDate)
            .HasDefaultValueSql("getutcdate()");

        modelBuilder.Entity<CaseDetail>()
            .Property(b => b.CreateBy)
            .HasDefaultValue("System");

        modelBuilder.Entity<CaseDetail>()
            .Property(b => b.IsDeleted)
            .HasDefaultValue("0()");
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我以有效的方式做到这一点,以便它可用于所有实体吗?

谢谢

entity-framework-core asp.net-core-2.0

3
推荐指数
2
解决办法
2050
查看次数