[英]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
您还可以考虑实现扩展方法IEnumerable<IDeletable> Active()
,并且杂乱无章将移至用法部分: user.Roles.Active()
。 真的无法确定哪种方法对您的情况而言会更优雅。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.