2017-12-15 13 views
1

나는,Entity Framework를 사용하여 상위 테이블 만 포함하는 방법?

public Status() 
{ 
     this.Voucher_BankPayment = new HashSet<Voucher_BankPayment>(); 
     this.Voucher_BankReceipt = new HashSet<Voucher_BankReceipt>(); 
     this.Voucher_CashPayment = new HashSet<Voucher_CashPayment>(); 
     this.Voucher_CashReceipt = new HashSet<Voucher_CashReceipt>(); 
     this.Voucher_Journal = new HashSet<Voucher_Journal>(); 
     this.Voucher_Log = new HashSet<Voucher_Log>(); 
     this.Voucher_Workflow = new HashSet<Voucher_Workflow>(); 
} 

부모 테이블 상태를 포함에

FMSEntities db = new FMSEntities(); 
db.Voucher_BankReceipt.Include(x => x.Status) 

상태가 아래 hashsets에 주어진 다른 아이를 참조하는 부모 테이블 인 경우 ... ..로 웹 API를 통해 데이터를 반환하고 있습니다 그것은 참조 된 모든 해시 셋 객체를 포함합니다. Voucher_BankReceipt & 다른 해시셋 json을 다시로드하지 않으려면 어떻게해야합니까?

+0

평소와 같이 : 지연로드를 해제하십시오. 하지만 대답의 선택이 더 바람직합니다. –

+0

내 대답이 귀하의 질문에 만족 했습니까? 그렇다면 수락을 고려하십시오. –

답변

3

일반적으로 Entity Framework 객체를 Web API JSON Serializer에 보내지 않고 방금 이유를 알아 냈습니다.

대신 EF에서 필요한 것 또는 API 호출자가 필요로하는 것을 정확하게 사용해야합니다. Serializer가이를 알 수있는 방법은 없습니다. 그 특성으로 인해 거의 항상 너무 많이 잡을 것이며 결과적으로 루핑 오류가 발생할 수도 있습니다.

해결 방법은 호출자가 필요로하는 EF 객체의 일부를 복사하고 EF 객체의 객체를 채우고 반환하는 객체/ViewModels를 만드는 것입니다.

더러운 빠른 및-방법은 예를 들어, 익명의 객체를 사용하는 것입니다 단지에서 간단한 속성 (숫자, 부울, 문자열, 날짜)를 지정하는 것입니다

// Instead of "return EF_Product;" you can use this: 
return new 
{ 
    Product = new 
    { 
     Id = EF_Product.Id, 
     Name = EF_Product.Name 
    } 
}; 

좋은 규칙의 엄지

EF 객체를 ViewModel 항목에 추가합니다. 아직 다른 EF 개체 (또는 EF 개체 컬렉션) 인 EF 개체 속성을 만나면 EF에 연결되지 않은 '단순한'개체로 변환해야합니다.

스펙트럼의 다른 끝에는 AutoMapper와 같은 라이브러리가 있습니다. 실제 ViewModel 클래스가 필요하다고 결정하면 AutoMapper는 EF 객체를 매우 ViewModel에 매핑하는 데 도움을줍니다.

+0

루핑 오류 = 재귀. –