我有一个用户表,其中我使用软删除方法来确保要删除的用户仅被虚拟删除。这是因为用户可能仍有一些费用,即使他们被删除,我们也需要向他们发送发票。
在我使用的实体框架OnModelCreating
modelBuilder.Entity<UserDomain>().Property<bool>("isDeleted");
modelBuilder.Entity<UserDomain>().HasQueryFilter(m => EF.Property<bool>(m, "isDeleted") == false);
现在,无论我在哪里得到用户,(软(删除的用户都被忽略了。尽管它们仍然存在于数据库中。
但是,现在我想做一个包含被淘汰用户的查询,以便我可以在需要时向他们发送发票。
我想我可以通过使用context.Users.FromSql([query])
来绕过它。但事实并非如此。它仍然过滤掉已删除的记录。
如何绕过QueryFilter
?
使用 .IgnoreQueryFilters((
var list = context.Users.IgnoreQueryFilters();
简单的解决方案是只使用具有不同配置的不同 DbContext。
DbContext不是数据库的模型,您不需要(实际上不应该(每个应用程序或数据库只有一个 DbContext。DbContext 本质上是 DDD 术语中的工作单元/界定上下文。
此外,DbContext 包含实体而不是表。它的工作是将应用程序对象/实体映射到关系表。它不应该是数据库的副本。
例如,没有什么可以阻止您为最终映射到相同表的不同业务上下文使用具有不同或更少属性的实体。
在 Web 应用中,需要不同的数据来对用户进行身份验证,需要不同的数据来显示注册用户列表或显示问候语。例如,没有理由加载用户的所有属性进行身份验证,也不必在显示用户列表时加载密码哈希。