2016-08-09 89 views
0

我在我的應用程序中使用IsDeleted列實施軟刪除,並使用EF 6 Code First for ORM。我想用點運算符來訪問懶加載導航性能(與許多關係)。例如,當自動過濾刪除實體:一個用戶有很多角色實體框架6自動過濾延遲加載導航屬性

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攔截器,但它適用於所有的疑問,我仍然希望由於業務需求在某些地方加載已刪除的實體。 有沒有其他方法可以有效實現這一點?
謝謝。

回答

0

你可以只添加一個 「更合適的」 屬性來封裝邏輯:

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()。真的不知道哪種方法會更適合您的情況。

+0

感謝SimpleVar。但是我的應用程序有數千個這樣的集合,所以如果我添加更多的包裝屬性或使用Active()擴展方法將非常耗時。 –

相關問題