2016-09-21 8 views
0

Entity 프레임 워크에서 DbContext를 초기화 할 때 엔터티의 데이터 집합을 필터링 할 수 있습니까?쿼리를 사용하는 엔터티 프레임 워크 DbContext

다음 호가 있습니다 : ERP 시스템 데이터베이스에서 생산 데이터를 읽으 려합니다. 모든 부서는 데이터가 속한 부서의 필드가있는 하나의 테이블에 데이터를 저장합니다. 이제 저는 단 하나의 특정 부서를위한 소프트웨어를 개발 중입니다. 물론 나는 DbSet에있는 모든 데이터를 읽을 수 있습니다 다음과 같이 내 응용 프로그램 코드에서이 부서의 단지 데이터 세트를 조회 :

 Dim test As New DB.ModelProd() 
     Dim cl As New List(Of DB.Charge) 
     cl = test.Charges.ToList().Where(Function(ch) ch.Company = 3 And ch.ChargeId IsNot Nothing).ToList() 
     'do something with cl 

을하지만 이후가 원하지 않는 한 부서에 대한 응용 프로그램입니다 내가 결코 사용하지 않을 다른 사람들의 데이터를 읽고 만진다. 또한 오류가 발생하기 쉽기 때문에이 세부 정보를 응용 프로그램에서 숨기고 싶습니다 (사용하기 전에 데이터를 필터링하는 것을 잊지 마십시오).

그래서이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

최고 감사합니다, 로널드

+0

BL 또는 DAL에이 세부 정보를 포함 할 수 있습니다. 여기서 예를 들어, DbSets 또는 그로부터 리턴 된 IQueryables를 대체 할 수 있습니다. – DevilSuichiro

+0

하나는'.ToList()'를 먼저 제거해야합니다. 하지만 나는 당신이 [EntityFramework.DynamicFilters] (https://github.com/jcachat/EntityFramework.DynamicFilters)처럼 될 것이라고 생각합니다. –

답변

1

거기에 "최고"방법은 없습니다 -하지만 여기에 몇 가지 옵션이 있습니다 :

  • 저장 프로 시저를 통해 모든 액세스를 구현 모든 통화 부서 ID를 요구,
  • 쿼리를 생성하고 부서별 필터를 추가하는 컨텍스트 주위의 리포지토리를 만듭니다.

리포지토리 사용 다중 계층 시스템에서 가장 관용적 인 방법입니다. 스토어드 프로 시저를 사용하면 프로 시저에만 액세스 권한을 부여하고 다른 사용자가 컨텍스트를 직접 사용하거나 데이터베이스를 쿼리하지 못하도록 방지 할 수 있기 때문에 보안이 강화됩니다. 그러나 프로그래밍이 어려워집니다 (Linq를 자유롭게 사용할 수 없게됩니다).

+0

Up 저장소 권장 사항에 대해 투표했습니다. 저장소 패턴의 구현은 부서 요구 사항을 숨기기 위해 필요한 것입니다. – robaudas

0

IDbCommandTreeInterceptor을 구현하고 EF에서 생성 한 DbCommandTree를 변경하십시오. 실제 단계에 대한 자세한 내용은 blog post에서 확인할 수 있습니다.