2016-08-09 8 views
0

私のアプリケーションでIsDeletedカラムを使用してソフト削除を実装していて、ORMにEF 6 Code Firstを使用しています。それは、ユーザーが多くの役割Entity Framework 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を使用するとき、私はそれを必要とする:私は例.FOR(多くの関係で)遅延ロードのナビゲーションプロパティにアクセスするためのドット演算子を使用したときに自動的に削除するエンティティをフィルタリングしますオートフィルターは、エンティティを削除しますので、私はそれが多くの場所で発生しますので、同じように明示的にそれを書き込みません:

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()拡張メソッドを使用すると非常に時間がかかります。 –