[英]Entity framework add where clause to all queries
我有一个使用实体框架和AspNet标识的项目。
IdentityUser的参数之一是停用字段。
在应用程序中,如果我想吸引用户,我可以这样做:
var users = Context.Users //etc....
但是,我不希望该查询返回任何停用的用户。 我知道我能做到
var users = Context.Users.Where(x => x.Deactivated != true);
但是,我不愿意这样做,因为我确信随着时间的流逝,有人会忘记添加此where子句。
实体是否可以对所有上下文查询自动执行此操作? 我发现了这一点:
https://docs.microsoft.com/zh-cn/ef/core/querying/filters
但是我没有EF核心,无法升级到它。
我知道我可以做一个包装器函数并调用它,但是我试图找到一个更好的解决方案...
我经常使用XXXStore
成员和XXX
成员的组合,其中XXXStore
是DBSet
且XXX
是使用AsNoTracking()
的查询。 然后,仅在我想更新数据库时,才在响应GET
的查询中使用XXX
成员,而在XXXStore
使用。 例如
public DbSet<User> UserStore { get; set; }
public IQueryable<User> Users => UserStore.AsNoTracking();
这具有以下优点:不跟踪不会更新的实体,而是采用DRY方法,这意味着不会在整个地方都AsNoTracking()
添加AsNoTracking()
。
这种方法可以很容易地与where
子句结合使用:
public DbSet<User> UserStore { get; set; }
public IQueryable<User> Users => UserStore.AsNoTracking().Where(u => !u.Deactivated);
过滤器也可以工作,但是这种方法的优点是,当您确实确实确实需要访问停用的用户时,很容易将其作为例外。
您可以使用全局过滤器:
protected override void OnModelCreating(ModelBuilder modelBuilder){
modelBuilder.Entity<Blog>().Property<string>("TenantId").HasField("_tenantId");
// Configure entity filters
modelBuilder.Entity<Blog>().HasQueryFilter(b => EF.Property<string>(b, "TenantId") == _tenantId);
modelBuilder.Entity<Post>().HasQueryFilter(p => !p.IsDeleted);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.