我首先使用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
答案 0 :(得分:1)
如何制作自定义视图
像这样:dbo.AvailableCustomers
CREATE VIEW dbo.AvailableCustomers
AS SELECT * FROM Customers
Where Deleted IS NULL;
然后Context的客户DBSet将指向新视图。