2017-12-20 8 views
0

복잡한 사용자 지정 개체의 배열을 응답으로 반환하는 WebAPI 서비스를 개발했습니다. 일부 필드는 다 대 다 관계가 있습니다. 예를 들어WebAPI 응답으로 인해 "System.OutOfMemoryException"이 발생합니다.

각 OEReference 오브젝트는 해당 IAReferences 목록 등 그리고 절대과 동시에 각 IAReference 오브젝트 (제 포함) OEReference의 목록이 IAReferences 목록을 가지고
[Table("OEReferences", Schema = "public")] 
public class OEReference 
{ 

    [NotMapped] 
    public IList<IAReference> IAReferences{ get; set; } 

} 

[Table("IAReferences", Schema = "public")] 
public class IAReference 
{ 

    [NotMapped] 
    public IList<OEReference> OEReferences{ get; set; } 

} 

멈 춥니 다.

때때로 메모리 부족 예외가 발생합니다. 이것이 이유입니까? 어떻게 방지 할 수 있습니까?

두 개 이상의 IAReferences가 포함 된 약 50 개의 OEReference가 깨졌습니다. 나머지 필드는 아주 간단합니다. .Net 4.7.1에서 HttpClient 클래스를 사용합니다.

답변

1

(기본 제공 JSON 직렬화기를 통해) 웹 API에서 직접 Entity Framework 객체를 반환하는 것처럼 보입니다. 일반적인 규칙은 JSON 시리얼 라이저가 찾을 수있는 모든 것을 직렬화하려고하기 때문에 절대로하지 않는 것입니다. 그러나 당신과 같은 관계가있는 EF Object를 사용하면 어디에서 멈추어야하는지 알 수 없기 때문에 Reference Loop 오류 또는 Out of Memory 오류가 발생할 수 있습니다.

대신 EF 개체에서 필요로하는 것, 정확하게는 API 호출자가 필요로하는 것을 정확하게 사용해야합니다.

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

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

// Instead of "return EF_Item": 
return new 
{ 
    Item = new 
    { 
     Id = EF_Item.Id, 
     Description = EF_Item.Description, 
     Things = MapThings(EF_Item.Things) // helper function that you need to provide 
    } 
}; 

좋은 규칙의 엄지

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

구조화 된 접근 방식은 ViewModel 클래스를 사용하는 것이므로 언제든지 필요할 때마다 매핑을 수행하는 AutoMapper와 같은 도구를 사용하여 더 구조화 할 수 있습니다.

관련 문제