2016-08-09 19 views
0

Ich implementiere Soft Deletion in meiner App mit IsDeleted Spalte und EF 6 Code First für ORM verwenden. Ich möchte automatisch gelöscht Einheiten filtern, wenn für den Zugriff auf ein träges Laden Navigationseigenschaften Punktoperator (mit Beziehung) .Für Beispiel: Ein Nutzer hat viele RollenEntity Framework 6 automatische Filterung für lazy Loading Navigationseigenschaften

public class User 
{ 
    private ICollection<Role> _roles; 
    public virtual ICollection<Role> Roles 
    { 
     get { return _roles?? (_roles= new List<Role>()); } 
     protected set { _roles= value; } 
    } 
} 

und ich brauche, wenn ich user.roles verwenden, ist es wird Entitäten auto Filter gelöscht, so dass ich es nicht explizit wie schreiben, weil es an vielen Orten geschehen wird:

user.Roles.where(u => u.IsDeleted == false).ToList(); 

ich denke an EF Interceptor, aber es wäre für alle Fragen gelten, und ich möchte noch laden Sie gelöschte Entitäten an einigen Stellen aufgrund von Geschäftsanforderungen. Gibt es andere Möglichkeiten, dies effizient zu erreichen?
Danke.

Antwort

0

Sie können nur eine "richtigere" Eigenschaft hinzufügen, die Logik zu kapseln:

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); } 
    } 
} 

Verbrauch:

IEnumerable<Role> roles = user.ActiveRoles; // easy 
  • ich Ihre Objekte gehe davon letztlich etwas IDeletable oder etwas umzusetzen.
    Dies wurde
  • weggelassen

Sie auch eine Erweiterungsmethode IEnumerable<IDeletable> Active() und die Unordnung der Verwendung Teil wird verschoben betrachten kann Durchführungs: user.Roles.Active(). Kann nicht wirklich sagen, welcher Ansatz für Ihren Fall eleganter sein wird.

+0

Danke SimpleVar. Aber meine App hat so viele Tausende von Sammlungen, dass es sehr zeitaufwändig wäre, wenn ich weitere Wrapper-Eigenschaften hinzufüge oder die Active() - Erweiterungsmethode verwende. –