2014-11-11 4 views
1

EF 매핑 클래스에서 탐색 속성을 "가짜"로 만들고 싶습니다.Entity Framework : 쿼리 가능 탐색 속성 "Faking"

책 ("isbn"으로 표시)과 구매 ("isbn"으로 식별)가있는 예를 고려하십시오. 책과 구입은 의도적으로 서로 직접 매핑되지 않습니다.

지금은 쿼리 가능한 형식으로 책의 모든 구매를 반환 "예약", 그래서 결국

public class Book 
{ 
    public virtual string isbn { get; set; } 
    public virtual string name { get; set; } 


    // Pseudo-code .. does not work, throws an exception 
    // "LINQ to Entities does not recognize the method [...], and this method cannot 
    // be translated into a store expression 
    public virtual IQueryable<Purchase> get_purchases(DbContext context) 
    { 
     return context.Purchases.Where(purchase => purchase.isbn == this.isbn); 
    } 
} 

public class Purchase 
{ 
    public virtual string isbn { get; set; } 
    public virtual double price { get; set; } 
} 

같은에 대한 확장 메서드를 작성하고 싶습니다, 내가 할 싶습니다 같은 (완전 임의 예)와 같은 임의의 쿼리

그러나 주석에 언급 된 EF/LINQ 내 확장 방법을 사용하지 수, 나의 접근 방식은 작동하지 않습니다.

이렇게 할 방법이 있습니까? 문은 단일 SQL 쿼리로 변환 할 수 있어야합니다. 불필요하게 거대한 데이터 집합을 회수하지 않으려면 .ToList()와 같은 메서드를 사용하고 싶지 않습니다.

수있는이

Expression<Func<Book, IQueryable<Purchase>>> 

또는 종류의 아무것도 반환하는 함수를 만들어 사용할 수 있습니까? (내가 표현을 쓰는 데 절대적으로 끔찍하기 때문에 이것을 시도 할 수 없었습니다), 아니면 다른 접근법이 있습니까?

면책 조항 : 명시 적으로 구매 내역을 매핑하지 않는 것이 좋습니다. < -> 본즈; 질문과 관련이 없어야하지만 배경은 Floremin의 대답을 기반으로합니다 to this question

고마워요!

+0

글쎄, 당신은 다른 질문에 대한 대답을 통해이-해석이있을 수 있습니다. isbn을 기본 키로 사용해서는 안된다는 사실은 당신이 관계를 가질 수 없다는 것을 의미하지는 않습니다. 자동 증가 (IDENTITY) int 필드 (예 : Id)와 같은 대리 키를 기반으로해야합니다. 책과 구매 사이에 관계가있을 수 있습니다.구매 엔티티에 isbn을 가질 필요가 없습니다. –

+0

안녕하세요, 주요 문제는 실제로 책 테이블에 항목이없는 ISBN에 대한 구매를 때때로 삽입해야한다는 것입니다 (나중에 어떤 시점에서 예정). 따라서 기본 키가 무엇이든, 내가 그 경로를 따라 간다면, 테이블에 추가/중복 필드를 포함하여 임시 null 참조가 있고 테이블에 null 참조가 수동으로 업데이트된다는 것을 의미합니다. 불행히도 자체적 인 추가 문제와 복잡성이있는 해결책 – Bogey

답변

1

LINQ to entities는 LINQ 쿼리를 SQL 쿼리로 변환 한 다음 데이터베이스 (서버)에서 보내고 실행합니다. 따라서 get_purchases 메서드를 저장소 식 (SQL)으로 변환 할 수 없다는 예외가 발생합니다. 여기

var books = from b in dBContext.Books 
      join p in dBContext.Purchases on b.isbn equals p.isbn 
      where p.price > 90 
      select b; 

은 훌륭한 LINQ 자원입니다 :

지불 된 책은 90 개 이상의 당신이 LINQ 연산자를 가입 사용할 수 있습니다 얻으려면 LINQ 101

이 같은 EF-같은 탐색 속성을 갖고 싶어 Book.Purchases 데이터베이스에 실제 관계가없는 경우 모든 속성 및 메서드에 사용되는 DbContext으로 초기화되는 자체 데이터 리포지토리 계층을 만들어야합니다. 그런 다음 모든 데이터 액세스에이를 사용하게됩니다. 즉, DbContext을 코드에 직접 사용하지 않아야합니다. 이것은 대용량 프로젝트에서 좋은 습관입니다. 특히 데이터베이스에 저장되기 전에 비즈니스 규칙과 데이터 조작을 구현해야하는 경우에 좋습니다. "저장소 패턴"을 찾아 보면 많은 자원을 찾을 수 있습니다.

여기 하나 : Using the Repository Pattern with ASP.NET MVC and Entity Framework

+0

저장소는 프로젝트가 다소 규모가 작기 때문에 내가 피하고자했던 것입니다. 이 패턴은 대부분의 제어가 가능하므로이 옵션을 사용하면 (탐색 속성으로 직접 매핑되지 않은 항목과 함께)이 옵션을 사용할 수 있습니다. 불행하게도 특정 저장소 메소드를 꽤 많이로드해야하지만, 결국에는 복잡한 일이며 최소한 솔루션을 "깨끗하게"유지하고 알맞은 코드 표준을 유지할 것입니다. 귀하의 의견을 보내 주셔서 감사합니다! – Bogey