实体框架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拦截器,但它将适用于所有查询,我仍然想在某些地方加载删除的实体,因为业务需求。还有其他有效的方法吗?
谢谢你。
你可以添加一个"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()
。我不知道哪种方法更适合你的情况