1

ASP.NET MVC4 웹 API를 사용하여 제품 목록을 반환하는 RESTful 웹 서비스를 만들려고합니다. 내 서비스를 실행하고 브라우저에서 다음 URL을 호출 할 때 여기 내 컨트롤러 클래스ASP.NET MVC4 웹 API 컨트롤러 serialization

public class ProductController : ApiController 
{ 
    public IEnumerable<Product> GetProducts() 
    { 
     WebCatalogContext dbcontext = DatabaseConfig.Instance.Context; 
     List<Product> plist = dbcontext.Products.ToList(); 
     return plist; 
    } 
} 

입니다 :/API/제품, 나는 System.Runtime.Serialization.SerializationException를 얻을. 나는 내 plist 객체를 들여다 보았고 아무 문제가 없다. 내 제품 클래스에서 ProductCategory에 대한 참조를 제거하면

[DataContract(Name = "p")] 
[Serializable]  
public class Product 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [DataMember(Name = "id")] 
    public int Id { get; set; } 

    [Required, MaxLength(50)] 
    [DataMember(Name = "ti")] 
    public string Title { get; set; } 

    [Required] 
    [DataMember(Name = "de")] 
    public string Description { get; set; } 

    [Required] 
    [DataMember(Name = "ph")] 
    public string PhotoURL { get; set; } 

    [DataMember(Name = "ca")]   
    public virtual ProductCategory Category { get; set; } 
} 


[DataContract(Name="pc")] 
[Serializable] 
public class ProductCategory 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [DataMember(Name="id")] 
    public int Id { get; set; } 

    [DataMember(Name="nm")] 
    public string Name { get; set; } 
} 

이 모든 일이 잘 작동 :

여기 내 데이터 모델이다. 그러나 그것을 포함 시키면 다음과 같은 예외가 발생합니다.

Type 'System.Data.Entity.DynamicProxies.Product_664E9A0AA1F165A26C342B508BFFF1279FD3FE059285225BDA19F407A29A9CAD' with data contract name 'Product_664E9A0AA1F165A26C342B508BFFF1279FD3FE059285225BDA19F407A29A9CAD: http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies ' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

내가 놓친 거지 대해 어떤 생각? 이 게으른 로딩을 수행 할 수 있도록

감사

답변

1

엔티티 프레임 워크는 EF 프록시 POCO와 POCO 싸서 -이 '게으른 -로드 할 수있는'탐색 속성을 만들 수 Virtual 속성을 사용합니다. 그게 직렬화 오류가 어디에서 비롯됩니다 기대하고있다.

새로운 클래스를 만들고 POCO를 매핑 한 다음 컨트롤러에서 DTO 스타일 클래스를 전달할 수 있습니다. 나는 EF 객체를 API에서 직접 반환하지 않았습니다. (저는 항상 다른 것을 매핑합니다) 그래서 다른 옵션을 알지 못합니다.

당신이, EF는 어떤 모델을위한 프록시를 생성합니다 virtual로 선언 탐색 속성에 대한 게으른로드를 지원하기 위해 http://valueinjecter.codeplex.com/ 또는

+0

답변 주셔서 감사합니다. 매우 도움이됩니다. – Furkan

1

http://automapper.org/ 같은 도구를 사용하는 경우 DTO (데이터 전송 객체)에 EF POCO는 상대적으로 통증이 이러한 종류의 예외를 유발하는 탐색 속성이 있습니다.

매우 간단한 응용 프로그램의 경우 EF 모델을 DTO (탐색 속성이없는 경우)로 사용할 수 있지만 복잡한 응용 프로그램의 경우 DTO와 도메인 모델간에 구분해야합니다. DTO와 도메인 모델간에 1 : 1로 매핑하면 안됩니다.

따라서 웹 API 레이어에 대한 DTO 모델을 더 많이 만들면 괜찮을 것입니다.

관련 문제