同一实体但具有不同过滤器的多个 DbSet<>

Mor*_*der 4 c# entity-framework entity-framework-core

DbSet<>为了让我们的一些开发人员的生活更轻松,我想为一个数据库实体/表创建两个。这是一个例子:

public class User
{
    public int Id { get; set; }
    public DateTime Deleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
public class UserContext : DbContext
{
    public DbSet<User> DeletedUsers { get; set; }
    public DbSet<User> ActiveUsers { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //for ActiveUsers
        modelBuilder.Entity<User>().HasQueryFilter(e => e.Deleted == null);

        //for DeletedUsers
        modelBuilder.Entity<User>().HasQueryFilter(e => e.Deleted != null);
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使我的两个 DbSet<> 区分这两者?我希望能够说出来dbContext.DeletedUsers.Where(x => x.Id == .....),而不是必须说dbContext.Users.Where(x => x.Deleted != null && x.Id == ......)出来,因为人们可能不记得他们正在处理已删除的用户(或相反)。

Dav*_*oft 5

您不需要为此使用 DbSet,因为它是同一个实体,只需公开 IQueryable 属性,例如

public class UserContext : DbContext
{
    public DbSet<User> Users { get; set; }

    public IQueryable<User> ActiveUsers => Users.Where(e => e.Deleted == null);

    public IQueryable<User> DeletedUsers => Users.Where(e => e.Deleted != null);

}
Run Code Online (Sandbox Code Playgroud)

Users如果您愿意,您还可以省略该属性,并User在 OnModelCreating 上配置为实体,然后仅在DbContext.Set<User>()必要时访问所有用户。