c# - 多个 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 == ......)
同样的话,因为人们可能不记得他们正在与已删除的用户打交道(或相反)。
解决方案
您不要为此使用 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>()
在必要时访问所有用户。
推荐阅读
- python - 逻辑回归 DataFrame 列名的数量与管道中的系数数量不匹配
- rest - 通过 APIM 使用 Azure 功能的 REST URL
- python - 使用 Schedule Python 包时 Psycopg2 更新未运行
- cypress - 运行无头浏览器 firefox 时赛普拉斯 scrollHeight 属性不正确
- cassandra - 一致性级别与 Cassandra 原生二级索引有何关系?
- javascript - 在 Node-RED 中解码 AES-CTR 消息
- c# - 为什么当鼠标悬停在 Wpf 窗口中的控件上时位置会更改
- vscode-tasks - 在vscode中编写任务时如何设置活动文件?
- python - 与相同的 VGG16 模型完全不同的行为
- c# - 如何使用 LINQ 查找 2 个列表之间的差异