我有一个使用Entity Framework和AspNet Identity的项目。
IdentityUser的参数之一是停用字段。
在应用内,如果我想吸引用户,我会这样做:
var users = Context.Users //etc....
但是,我不希望该查询返回任何停用的用户。我知道我可以做到
var users = Context.Users.Where(x => x.Deactivated != true);
但是,我不愿意这样做,因为我敢肯定,及时就会有人忘记添加where子句。
实体是否可以对所有上下文查询自动执行此操作?我发现了:
https://docs.microsoft.com/en-us/ef/core/querying/filters
但是我没有EF内核,无法升级到它。
我知道我可以创建一个包装函数并调用它,但是我正在尝试寻找更好的解决方案...
答案 0 :(得分:3)
我经常使用XXXStore
成员和XXX
成员的组合,其中XXXStore
是DBSet
,而XXX
是带有{{1 }}。然后,仅在我想更新数据库时,才在响应AsNoTracking()
的查询中使用XXX
成员,而对GET
进行响应。例如
XXXStore
这具有以下优点:不跟踪不会更新的实体,而是采用DRY方法,这意味着不会在整个地方都冗长地添加 public DbSet<User> UserStore { get; set; }
public IQueryable<User> Users => UserStore.AsNoTracking();
。
这种方法可以很容易地与AsNoTracking()
子句结合使用:
where
过滤器也可以工作,但是这种方法的优点是,当您确实确实确实需要访问停用的用户时,很容易将其作为例外。
答案 1 :(得分:0)
您可以使用全局过滤器:
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);
}