2016-12-09 7 views
3

문제점 도메인EF 프록시 복잡한 데이터 구조

지금은 EF 그래서 난 간단하게 할 수있는 사용하고

public class HierarchyObject 
{ 
    [Key] 
    public int Id { get; set; } 
    [ForeignKey("Parent")] 
    public int ParentId { get; set; } 
    public virtual HierarchyObject Parent { get; set; } 
    public virtual ICollection<HierarchyObject> Children { get; set; } 
} 

좋아요 ... 나는 이런 식으로 뭔가를 보이는 기업을 말해봐 뭔가 등 ...

var ctx = new MyContext(); 
var getAll = ctx.HierarchyObjects.AsQueryable(); 

지금은 너무 특정 사용자 만 내가 migh 이러한 개체의 하위 집합에 기본 CRUD 작업을 할 수 이러한 개체에 권한을 추가 말할 수 이제 다음과 같은 작업을 수행 할 수 있습니다.

getAll = getAll().Where(o => o.Permissions.Any(p => p.Read && UserId == currentUserId)); 

이렇게하면 사용자가 액세스 할 수있는 항목 만 반환됩니다.

이제 이것을 쿼리 가능한 끝점 뒤에 표시하고 OData라고 말합니다.

중 하나로, OData 날과 같은 URL을 쓸 수 있습니다 ...

~/API/HierarchyObject? $ = 어린이가

... 난 그냥 내 보안을 깼다 수행 한 확장 결과는 "내가 접근 할 수있는 모든 객체와 그 자식"이 될 것이고 실제 질문은 "내가 액세스 할 수있는 모든 객체가 내가 액세스 할 수있는 모든 자식으로 확장 될 수 있어야하므로 EF 프록시가 내 권한 규칙에 대해 알지 못하기 때문에 에".

그래서 제 질문은

이 EF를 알 수있는 방법이 있나요입니다 어린이 재산권 그것은 또한 where 절 ...

o.Children = o.Children.Where(o => o.Permissions.Any(p => p.Read && UserId == currentUserId)); 

을 적용 ... 것을 적용해야 크롤링 할 때 내 모든 계층 구조 객체에 대해 "프록시"할 때마다 그것을 지배합니까?

자세한 내용

나는이 발견 : 모든 아니라 좋은

How can I dynamically customize a POCO proxy in EF 4?

을 EF4에 불가능하다 난 할 노력하고있어 ssays하지만 난 그래서 EF6을 사용하고 있습니다 마이크로 소프트/다른 누군가가 어쩌면 지금까지 어떤 방식으로 프록시 작성 프로세스를 가로 채거나 대체 할 수있는 좋은 방법을 허용 할 수 있다고 생각했습니다. 아마도 IDbSet 유형을 프록시 규칙을 정의 할 수있는 규칙 훅의 드라이버로 사용했을 것입니다 관계형 크롤링을 위해 어떤 식 으로든 나는 아무것도 찾지 못했다!

답변

1

그래서 나는 이것에 대해 잘못된 길을갔습니다. relatinship 크롤링을 방지하기 위해 객체를 프록 싱하는 대신 EF 필터를 사용하여 반환 된 엔티티를 유형별로 제한 할 수 있음을 발견했습니다.

Nuget에는 비즈니스 로직 코드를 실행하기 전에 EF 기능을 확장하여 기본적으로 상황에 맞는 "db 절단"을 제공하는 패키지가 많이 있습니다.