2013-02-14 2 views
0

우리는 모든 저장소가 GetContext(), GetObjectSet() 및 GetObject()와 같은 메소드를 노출하는 (자체 제작 된) GenericRepository 기본 클래스 (여기서 T는 모델의 엔티티 임)를 기반으로하는 다중 계층 응용 프로그램을 가지고 있습니다. 곧. 우리는 WCF 서비스를 통해 데이터를 전달할 때 Include()를 호출해야하므로 컨텍스트에 액세스 할 수있는 저장소를 허용하므로 관련된 모든 엔터티를 열심히로드해야합니다.데이터베이스에서 데이터를로드 할 때 Entity Framework를 가로채는 수 있습니까?

우리의 모든 엔티티는 활성 bool 속성을 가진 인터페이스를 구현합니다. 우리가 원하는 것은 쿼리의 실행을 차단하고 Active 속성을 필터링하여 모든 쿼리가이 속성이 설정된 엔티티 만 반환하도록합니다 사실로.

이 작업을 수행 할 수 있습니까? EF에 구축 된 Lightswitch에는 쿼리 실행의 깊이에서 바로 잡을 수있는 이벤트가 있으며 이러한 종류의 필터링을 수행 할 수 있습니다. 나는 이것을 허용하는 EF 자체에서 아무것도 찾을 수 없다.

누구나 아이디어가 있으십니까? 감사합니다.

답변

1

IncludeIQueryable에 확장 방법이다, 그래서 당신은이 작업을 수행 할 수 있습니다, 당신은 당신의 일반적인 저장소에서 DbSet<T>을 반환하지 않아도 의미

var query = dbSet.Where(o => o.IsActive).Include(...) 

- 그것은 확인을해야 IQueryable<T>을 반환하십시오. 이 요구 사항을 충족하는 경우

, 당신은 당신의 일반적인 저장소 방법에 Where 절을 추가 할 수 있습니다

partial class GenericRepository<T> 
{ 
    public IQueryable<T> Query(bool includeInactive = false) 
    { 
    return ctx.Set<T>().Where(o => includeInactive || o.IsActive); 
    } 
} 
+0

안녕 니콜라스, 그리고 답장을 보내 주셔서 감사합니다. 나는 EF5에 관해 그것을 몰랐다. 나는 확실히 말할 정도로 깊이 파고 들지는 않았지만, v4.x의 일부 버전에서도 이런 모습을 보일 수 있습니다. 어쨌든, 이것은 몇몇 문제를 분류하는 것을 제외하고 이것은 자기 추적 엔티티를 야기했습니다. 이것은 답변과 같습니다. 다시 한번 감사드립니다. –

+0

@AvrohomYisroel 기꺼이 도와 드릴 수 있습니다 :) –

1

제가 생각하는 가장 좋은 방법은 저장소 방법에 표현식 (예 : Expression<Func<T, bool>> predicate)을 사용하는 것입니다. 그렇게하면 실제 저장소 자체에서 모든 쿼리를 수행 할 수 있으므로 (클라이언트 측 코드에서 데이터 계층 논리에 액세스하지 못하게) Where을 추가 할 수있는 저장소 방법에서 돌아 오기 전에 해당 인스턴스 만 가져올 수 있습니다 그것은 활성입니다.

내가 사용했던이 스타일의 예는 다음과 같다 :

DbSet 당신이 조회하려는 실제 테이블이
public IQueryable<T> Grab(Expression<Func<T, bool>> predicate) 
    { 
    return DbSet.Where(predicate); 
    } 

. 그런 식으로 .Where(x => x.Active)을 끝에 추가 할 수 있습니다. 데이터베이스에 대해 아직 실행하지 마십시오 (지연 실행을 감사드립니다.). 그러나 여전히 정확한 레코드를 얻습니다. EF 5에서

+0

감사를 제안합니다. 불행히도 이것은 매우 성숙한 프로젝트이며 저장소 코드를 리펙토링하는 것은 선택 사항이 아닙니다. 그래서 우리는 하나의 파일을 변경할 수 있고 다른 모든 파일은 변경 사항을 볼 수있는 방식으로 일반 저장소에서이 작업을 수행하고자합니다. 중요한 재 작성의 사치가 있다면 우리는 많은 일을 매우 다르게 할 것입니다! 어쨌든 고마워. –

관련 문제