繁体   English   中英

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

[英]Entity Framework 6 automatic filtering for lazy loading navigation properties

我正在使用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拦截器,但是它将适用于所有查询,并且由于业务需求,我仍然想在某些地方加载已删除的实体。 还有其他方法可以有效地实现这一目标吗?
谢谢。

您可以添加一个“更合适的”属性来封装逻辑:

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() 真的无法确定哪种方法对您的情况而言会更优雅。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM