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 == ......)出来,因为人们可能不记得他们正在处理已删除的用户(或相反)。
您不需要为此使用 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>()必要时访问所有用户。