2012-03-06 2 views
1

엔티티 프레임 워크 코드 첫 번째 (그래서 아무 .edmx) 내가 할 수있는 부울의 IsEnabled와 기본 엔티티 클래스가 그래서 내가 사용 소프트의 삭제엔티티 프레임 워크 코드 첫 번째 소프트

내가 사용하고 저장소 패턴 게으른로드 삭제 저장소에 대한 모든 쿼리는 IsEnabled로 필터링 할 수 있습니다.

그러나 저장소를 사용하여 IsEnabled 인 MyType을 가져올 때마다 Lazy Loading MyType.Items는 항목을 사용할 수 없음을 의미 할 수 있습니다.

EF Fluent와 함께 테이블을 필터링하는 방법을 설명하는 방법이 있습니까?

업데이트 :

나는 Dbset

public class UnitOfWork : DbContext 
    { 
private IDbSet<MyObj> _MyObj; 
public IDbSet<MyObj> MyObjs 
     { 
      get { return _MyObj ?? (_MyObj = base.Set<MyObj>()); } 
     } 
} 

이 있다면 나는 DbSet를 필터링 할 DbContext를 알 수있는 방법이 있나요?

+0

또한 업데이트 후에도 여전히 대답은 : 아니요 물론 IQueryable MyFilteredObjs {get MyObjs.Where (m => m.IsEnabled)와 같은 컨텍스트 클래스에 속성을 추가 할 수 있습니다. }}'. 그러나 나는 그것이 당신이 원하는 것이 아니며 게으르고 열렬한 로딩에 적용되지 않는다고 생각합니다. – Slauma

답변

4

아니요. 지연로드 용 필터를 정의 할 방법이 없습니다 (Include을 사용하여 열렬한로드가 아닌 경우). 이 단지 활성화 항목 parentItems 수집을 채 웁니다

context.Entry(parent).Collection(p => p.Items).Query() 
    .Where(i => i.IsEnabled) 
    .Load(); 

: 당신이 당신의 탐색 모음 항목 만 채워 얻을하려면 어디에 IsEnabled 만 명시 적 로딩 예를 들어, 그에 따라 쿼리를 형성 할 수 true입니다 .

편집 나는 그의 머리를 얻는 손실 전투에 대한 나쁜 소식의 메신저와 같은 조금 떨어져 나 생각합니다. Entity Framework에 때로는 원하는 기능이 없다고 생각하는 것은 너무 어렵습니다. 당신을 설득하는 나의 기회를 향상시키기 위해 나는 quote from an authority, Julie Lerman 추가 : 엔티티 프레임 워크에

열망 로딩 어느 쪽도 연기/지연로드는 필터링하거나 가 반환되는 관련 데이터를 정렬 할 수 있습니다.

+0

EF 팀에게 추천 할 수있는 방법이 있었으면 좋겠다. – maxfridbe

+1

@maxfridbe : 실제로 기능 요청을 제안 할 수 있습니다 : http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions 이미 요청이 있습니다. 'Include' (열망하는로드) (요청 목록에 8을 놓음)로 필터링 할 수는 있지만, 느린로드에 대한 요청은 보지 못했습니다. – Slauma

+0

안녕하세요, 제가 오늘 늦게 여기에있는 것처럼 느껴졌습니다. 주어진 해결책은 좋은 깨끗한 것입니다. 이런 식으로 뭐가 잘못 됐어. var parent.items = context.Items.Where (x => x.parent_id == parent.parentID && x.IsEnabled == true) .ToList(); 그래서 parentID를 사용하고 있고 원하는 항목을 설정하고 있습니다. –

0

http://blogs.claritycon.com/blog/2012/01/25/a-smarter-infrastructure-automatically-filtering-an-ef-4-1-dbset/은 기본적으로 내가 원하는 것을 얻을 수있는 방법을 정의합니다.

기본적으로 FilteredDbSet을 만들고 모든 DbContext IDbSet에서 반환합니다.

+1

이것은 사용자의 질문에 대한 대답이 아닙니다. 이 FilteredDbSet은 지연로드에는 영향을주지 않지만 상위 엔티티에 대한 쿼리에만 영향을 미칩니다. 느슨하게로드되는 항목에 필터를 적용하는 방법을 묻습니다. * this * question에 관해서는 (지금 편집 한) 내 대답을 여전히 유효하다고 생각합니다. – Slauma

+0

FilteredDbSet이 나를 반쯤에 가져옵니다. 나는 이것을 말하고 싶지 않지만 [NotMapped] ActiveMyObjs {return MyObjs.Where ...와 같이 내 dmain에 추가 된 컬렉션을 추가했다. 사용법을 강요 할 방법은 없지만 효과가있다. – maxfridbe

1

아직 가능한 것처럼 보입니다. 당신이 intrested 경우 Wiktor Zychla blogpost, 그는 소프트 삭제 문제에 대한 해결책을 제공 살펴 볼 수 있습니다.

관련 문제