实体框架6自动过滤延迟加载导航属性

时间:2016-08-09 01:18:00

标签: c# entity-framework soft-delete

我正在使用IsDeleted列在我的应用中实现软删除,并使用EF 6 Code First进行ORM。我想在使用点运算符访问延迟加载导航属性(有很多关系)时自动过滤已删除的实体。例如:用户有很多角色

public class User
{
    private ICollection<Role> _roles;
    public virtual ICollection<Role> Roles
    {
        get { return _roles?? (_roles= new List<Role>()); }
        protected set { _roles= value; }
    }
}

我需要当我使用user.Roles时,它会自动过滤已删除的实体,所以我不会明确地写它,因为它会在很多地方发生:

user.Roles.where(u => u.IsDeleted == false).ToList();

我正在考虑EF Interceptor,但它适用于所有查询,我仍然希望在某些地方加载已删除的实体,因为业务需求。 有没有其他方法可以有效地实现这一目标?
谢谢。

1 个答案:

答案 0 :(得分:-1)

你可以添加更合适的&#34;封装逻辑的属性:

public class User
{
    private ICollection<Role> _roles;
    public virtual ICollection<Role> Roles
    {
        get { return _roles ?? (_roles = new List<Role>()); }
        protected set { _roles = value; }
    }

    public IEnumerable<Role> ActiveRoles
    {
        get { return this.Roles.Where(u => !u.IsDeleted); }
    }
}

用法:

IEnumerable<Role> roles = user.ActiveRoles; // easy
  • 我假设你的对象最终实现了一些IDeletable或者什么。
    这被省略了

您还可以考虑实施扩展方法IEnumerable<IDeletable> Active(),并将混乱移至使用部分:user.Roles.Active()。无法确定哪种方法会更适合您的情况。