首页 > 解决方案 > 多个 DbSet<> 用于同一实体但具有不同的过滤器

问题描述

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

public class User
{
    public int Id { get; set; }
    public DateTime Deleted { get; set; }
}
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);
    }
}

如何让我的两个 DbSet<> 区分这两者?我希望能够说dbContext.DeletedUsers.Where(x => x.Id == .....)而不是不得不说dbContext.Users.Where(x => x.Deleted != null && x.Id == ......)同样的话,因为人们可能不记得他们正在与已删除的用户打交道(或相反)。

标签: c#entity-frameworkentity-framework-core

解决方案


您不要为此使用 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);

}

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


推荐阅读