2016-08-09 1 views
0

IsDeleted 열을 사용하여 응용 프로그램에서 소프트 삭제를 구현하고 ORM에 EF 6 Code First를 사용합니다. 내가 예를 .FOR (많은 관계) 지연로드 탐색 속성에 액세스하기위한 도트 연산자를 사용하여 자동으로 삭제 엔티티를 필터링 할 : 사용자가 많은 역할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를 사용하는 경우, 그것은 자동 필터는 엔티티를 삭제, 그래서 나는 많은 장소에서 발생하기 때문에 같이 명시 적으로 쓰지 않습니다 : 내가 EF 인터셉터에 대해 생각하고

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

하지만, 모든 쿼리에 적용됩니다 내가 여전히 원하는 비즈니스 요구 때문에 일부 장소에서 삭제 된 항목을로드하십시오. 이것을 효과적으로 수행 할 수있는 다른 방법이 있습니까?
감사합니다.

답변

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

Thanks SimpleVar. 하지만 내 애플 리케이션이 이런 식으로 수천의 컬렉션을 가지고 있으므로 래퍼 속성을 추가하거나 Active() 확장 메서드를 사용하면 시간이 많이 걸릴 것이다. –