始终从Entity Framework中的DbSet中排除某些行

时间:2016-02-01 14:18:09

标签: c# entity-framework

我首先使用Entity Framework 6和数据库。在当前项目中,我在数据库中有一些永远不应该由Entity Framework提取的行。假设我有这个简化的模型:

    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的项目。这是因为系统有时会将Customers标记为已删除,然后应用程序不应该知道这些项目(就好像它们不存在一样)。

模型实际上更复杂,这就是为什么我想在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的提示。但是,它似乎不首先支持数据库。

  

很抱歉,但在使用Database First时,我们无权访问   模型配置,因此不支持。

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

1 个答案:

答案 0 :(得分:1)

如何制作自定义视图

  

dbo.AvailableCustomers

像这样:

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

然后Context的客户DBSet将指向新视图。