我正在使用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,但它适用于所有查询,我仍然希望在某些地方加载已删除的实体,因为业务需求。
有没有其他方法可以有效地实现这一目标?
谢谢。
答案 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
您还可以考虑实施扩展方法IEnumerable<IDeletable> Active()
,并将混乱移至使用部分:user.Roles.Active()
。无法确定哪种方法会更适合您的情况。