2012-09-28 10 views
7

유창한 API로 Entity Framework Code First를 만들었습니다.WebAPI Mvc4 솔루션에서 Entity Framework를 사용할 수 없습니다.

이 XML 파일은 그와 관련된 어떤 스타일 정보가 표시되지 않습니다 나는 오류가 GET 요청을하면

public class NewsController : ApiController 
{ 
    private TrafficTheoryContext db = new TrafficTheoryContext(); 

    // GET api/News 
    public IEnumerable<News> GetNews() 
    { 
     //return new List<News> { 
     // new News{ Title = "Featuring Azure ACS Authentication", Subtile="Hello "}}; 
     return db.News.AsEnumerable(); 
    } 
} 

:

나는 웹 API를 컨트롤러가 있습니다. 문서 트리가 아래에 나와 있습니다.

<Error> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'. 
</ExceptionMessage> 
<ExceptionType>System.InvalidOperationException</ExceptionType> 
<StackTrace/> 
<InnerException> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
Type 'System.Data.Entity.DynamicProxies.News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51C' with data contract name 'News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51C: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. 
</ExceptionMessage> 
<ExceptionType> 
System.Runtime.Serialization.SerializationException 
</ExceptionType> 
<StackTrace> 
at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType(XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle objectTypeHandle, Type objectType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle, Type declaredType) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle) at WriteArrayOfNewsToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract) at System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph) at System.Net.Http.Formatting.XmlMediaTypeFormatter.<>c__DisplayClass7.<WriteToStreamAsync>b__6() at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token) 
</StackTrace> 
</InnerException> 
</Error> 

뉴스 목록을 반환하면 벌금이 부과됩니다. 나는 어떤 것이 있는지 모르는 어떤 종류의 이름이 그 덩어리에 붙어있는 것을 알아 차 렸습니다.

webapi를 작동 시키려면 어떻게해야합니까?

답변

4

엔티티에 대해 생성 된 동적 프록시 때문에이 예외가 발생한다고 생각합니다. 예외 메시지를 살펴보면 News 유형은 실제로 serialize하지 않지만 System.Data.Entity.DynamicProxies.News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51C 유형은 직렬화됩니다. 이 유형은 지연로드를 지원하기 위해 Entity Framework에서 만들어졌습니다. 동적 프록시에 대한 자세한 내용은 여기 http://msdn.microsoft.com/en-US/data/jj592886을 참조하십시오. 나는 아주 잘 WebAPI를 모르는 그러나 예외는 사실의 수행 될 필요가 무엇인지 말한다 :

유형 'System.Data.Entity.DynamicProxies.News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51C를'데이터 계약 이름으로 'News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51C : HTTP : // 스키마를. datacontract.org/2004/07/System.Data.Entity.DynamicProxies ' 이 필요하지 않습니다. DataContractResolver를 사용하거나 KnottTypeAttribute 특성을 사용하거나 DataContractSerializer에 전달 된 알려진 형식 목록에 추가하여 알려진 형식 목록에 정적으로 알려지지 않은 형식을 추가하는 것이 좋습니다.

유형이 자동으로 만들어 지므로 속성을 넣을 수 없습니다. 따라서 "DataContractResolver 사용 고려"및 "DataContractSerializer에 전달 된 알려진 형식 목록에 추가"부분에 중점을 둡니다.

Btw 어떤 EF 버전을 사용하고 있습니까? 나는이 문제를 전에 보았다고 생각하며 EF5 RTM에서 수정되었다.

+0

내가 사용 : \ EntityFramework.5.0.0 \ lib 디렉토리 \ net40 \ EntityFramework.dll 그래 게으른 비활성화하고 PROXI이 문제를 해결 있지만 좋은 생각은 그게 전부 확실 메신저? –

+0

DataContractResolver가 무엇인지 모르겠습니까? –

+0

지연 로딩 (또는 프록시 생성)을 다시 비활성화 - 응용 프로그램이 사용하는지 여부에 따라 다릅니다. 그렇다면 네비게이션 속성이 자동으로로드되고 프록시 생성이 비활성화되어 있기 때문에 네비게이션 속성이로드되지 않을 것으로 예상되면 앱이 다운됩니다. – Pawel

0

.AsEnumerable 대신 .ToList()를 사용하십시오. 또한 데이터 컨텍스트를 어떻게 만들고 파괴하는지 궁금합니다.

+0

나는 방금 개인 TrafficTheoryContext를 넣어 봤어 db = new TrafficTheoryContext(); 컨트롤러 클래스에서. .AsEnumerable 잘 작동 - 그 비활성화 lazyloading 및 프록시 작동하는 것으로 나타났습니다. 이것은 나쁜 생각입니까? –

+1

@ s093294 - 글쎄, 그것을 비활성화함으로써 당신은 EF의 기능의 일부를 무력하게하고 있습니다. 즉, 사용하려는 모든 테이블을 명시 적으로 .Include()해야합니다. 그런 사람들도 있습니다. 또한 프록시 생성은 변경 내용 추적을 의미하지 않으며 변경 내용 추적은 컨텍스트의 상태를 동기화 된 상태로 유지하는 데 매우 중요합니다. 프록시 생성을 비활성화하면 레코드를 삽입, 업데이트 또는 삭제하는 방법에 대해 매우주의해야합니다. –

+0

좋아요, toList()를 사용하면 프록시의 목록 일뿐입니다. –

4

내 Mcv5 프로젝트에서 프록시 생성을 사용하지 않도록 설정할 때도 동일한 문제가 발생했습니다. 모든 것이 매력적으로 작동합니다. 도움이되기를 바랍니다.

DbContext.Configuration.ProxyCreationEnabled = false; 
관련 문제