始终从实体框架中的 DbSet 中排除某些行

本文关键字:排除 DbSet 实体 框架 | 更新日期: 2023-09-27 18:32:48

我首先将实体框架 6 与数据库一起使用。在当前项目中,数据库中有一些行永远不应该由实体框架获取。假设我有这个简化的模型:

    public partial class Customer
    {
        public Customer()
        {
        }
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime? Deleted { get; set; }
    }
    public partial class MyEntities: DbContext
    {
        public MyEntities()
            : base("name=MyEntities")
        {
        }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
        public virtual DbSet<Customer> Customers { get; set; }
    }

每次我在Customer DBSet上进行操作时,我真的只想获取具有Deleted == null的项目。这是因为系统有时会将客户标记为已删除,然后应用程序不应知道这些项目(就好像它们不存在一样(。

该模型实际上要复杂得多,这就是为什么我想在DbContext级别控制它,而不是在每个查询中添加Where() -子句。

有没有办法总是根据表中的列排除项目?

像这样:

public partial class MyEntities: DbContext
{
    public MyEntities()
        : base("name=MyEntities")
    {
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
        Customers = Customers.Where(x => x.Deleted == null); // Obviously not working...
    }
    public virtual DbSet<Customer> Customers { get; set; }
}

编辑:这将应用于复杂模型中大约 20-30 个不同的实体。所以我想避免视图并在代码中管理它。

编辑 2:感谢您提供有关EntityFramework.DynamicFilters的提示。但是,它似乎不支持数据库优先。

抱歉,但是在使用数据库优先时,我们无法访问 模型配置,因此不受支持。

https://github.com/jcachat/EntityFramework.DynamicFilters/issues/41

始终从实体框架中的 DbSet 中排除某些行

如何创建自定义视图

德博。可用客户

喜欢这个:

CREATE VIEW dbo.AvailableCustomers
AS SELECT * FROM Customers
Where Deleted IS NULL;

然后上下文的客户 DBSet 将指向新视图。