在EF的延迟加载中使用custom where子句

时间:2015-03-13 17:10:38

标签: c# entity-framework

我遇到了以下问题:

在这个项目中,必须删除注册表的物理(来自数据库),因此我在表示数据库表的每个类上创建一个名为deleted的bool属性。

在删除的情况下,该属性将变为true,并且只能由数据库内的SQL查询访问。

我使存储库等始终使用IQueryables返回query.where(x => !x.Deleted),但是如何在EF上“延迟加载”的Collections上执行此操作?

例如,当我得到一个Person并且它有ICollection时,它总是填充了链接到Person的所有对象,我总是必须手动过滤删除的那些。

有没有办法告诉EF在每次延迟加载时它应该使用自定义where子句?

1 个答案:

答案 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/