我正在构建一个多租户应用程序,并且遇到了我认为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) 我正在探索实体框架7,我想知道是否有办法拦截"SELECT"查询.每次创建,更新或删除实体时,我都会使用当前日期和时间标记实体.
SELECT *
FROM MyTable
WHERE DeletedOn IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
我希望我的所有SELECT查询都排除已删除的数据(请参阅上面的WHERE子句).有没有办法使用Entity Framework 7?
有什么方法可以将“HasQueryFilter”全局应用于我的所有实体?我不想一一添加模型构建器?
modelBuilder.Entity<Manufacturer>().HasQueryFilter(p => p.IsActive);
Run Code Online (Sandbox Code Playgroud) 如何结合BinaryExpression和Expression<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
我正在做代码首次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)
任何人都可以帮助我以有效的方式做到这一点,以便它可用于所有实体吗?
谢谢