我遇到了以下问题:
在这个项目中,必须删除注册表的物理(来自数据库),因此我在表示数据库表的每个类上创建一个名为deleted
的bool属性。
在删除的情况下,该属性将变为true,并且只能由数据库内的SQL查询访问。
我使存储库等始终使用IQueryables
返回query.where(x => !x.Deleted)
,但是如何在EF上“延迟加载”的Collections
上执行此操作?
例如,当我得到一个Person并且它有ICollection
时,它总是填充了链接到Person
的所有对象,我总是必须手动过滤删除的那些。
有没有办法告诉EF在每次延迟加载时它应该使用自定义where子句?
答案 0 :(得分:3)
您可以通过覆盖DbSet
来映射OnModelCreating
本身,从而过滤掉已删除的实体。
示例:
public class MyContext : DbContext
{
public virtual IDbSet<Company> Companies { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Company>()
.Map(m => m.Requires("IsDeleted").HasValue(false))
.Ignore(m => m.IsDeleted);
}
}
这会为false
属性设置默认值IsDeleted
,并过滤掉IsDeleted
为真的记录。
更多信息:https://putshello.wordpress.com/2014/08/20/entity-framework-soft-deletes-are-easy/