始终从实体框架中的 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
如何创建自定义视图
德博。可用客户
喜欢这个:
CREATE VIEW dbo.AvailableCustomers
AS SELECT * FROM Customers
Where Deleted IS NULL;
然后上下文的客户 DBSet 将指向新视图。