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

本文关键字:延迟加载 导航 属性 过滤 框架 实体 | 更新日期: 2023-09-27 18:01:19

我在我的应用程序中实现了IsDeleted列的软删除,并使用EF 6 Code First for 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时我需要它。角色,它会自动过滤删除的实体,所以我不会明确地这样写,因为它会在很多地方发生:

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

我正在考虑EF拦截器,但它将适用于所有查询,我仍然想在某些地方加载删除的实体,因为业务需求。还有其他有效的方法吗?
谢谢你。

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

你可以添加一个"more proper"属性来封装逻辑:

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()。我不知道哪种方法更适合你的情况