2016-11-19 83 views
0

我想在我的API中一起加入4個表,但不斷收到序列化錯誤。我在實體/上下文文件中擁有所有4個表模型及其關係,並嘗試將以下代碼添加到Global.asax文件中。我在想,我有一個循環參考問題,但我沒有真正理解這個問題,我有它,以及如何糾正它。由於這是我第一次嘗試API,所以我會很感激任何幫助。實體框架序列化錯誤

全球

public class WebApiApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     HttpConfiguration config = GlobalConfiguration.Configuration; 
     config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 
     AreaRegistration.RegisterAllAreas(); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 
} 

控制器

public class StaffAssignController : ApiController 
{ 
    private assignStaffEntities db = new assignStaffEntities(); 

    // GET api/StaffAssign 
    public IQueryable<staff_info> Getstaff_info() 
    { 
     return db.staff_info; 
    } 

    // GET api/StaffAssign/5 
    [HttpGet] 

    public IHttpActionResult Getstaff_info(string id) 
    { 
     staff_info staff_info = db.staff_info.Find(id); 
     if (staff_info == null) 
     { 
      return NotFound(); 
     } 
     Dictionary<string, object> dataContainer = new Dictionary<string, object>(); 
     var assign = (from a in db.staff_group_assignment 
         join g in db.groups on a.group_id equals g.group_id 
         join tc in db.time_commitment on a.attuid equals tc.attuid 
         join s in db.staff_info on a.attuid equals s.attuid 
         select new { a.group_id, a.attuid, a.iterations, a.title, g.kick_off_date, g.end_date, g.milestone, g.topic, g.status, tc.commitment_start_date, tc.commitment_end_date, s.email, s.first_name, s.last_name }); 
     var assignmentInfo = assign.ToArray(); 

     for (var i = 0; i < assignmentInfo.Length; i++) 
     { 
      dataContainer.Add("attuid", assignmentInfo[i].attuid); 
      dataContainer.Add("firstName", assignmentInfo[i].first_name); 
      dataContainer.Add("lastName", assignmentInfo[i].last_name); 
      dataContainer.Add("email", assignmentInfo[i].email); 
      dataContainer.Add("commitStartDate", assignmentInfo[i].commitment_start_date); 
      dataContainer.Add("commitEndDate", assignmentInfo[i].end_date); 
      dataContainer.Add("topic", assignmentInfo[i].topic); 
      dataContainer.Add("groupId", assignmentInfo[i].group_id); 
      dataContainer.Add("numOfMilestones", assignmentInfo[i].milestone); 
      dataContainer.Add("title", assignmentInfo[i].title); 
      dataContainer.Add("staffIterations", assignmentInfo[i].iterations); 
      dataContainer.Add("kickOffDate", assignmentInfo[i].kick_off_date); 
      dataContainer.Add("endDate", assignmentInfo[i].end_date); 
      dataContainer.Add("groupStatus", assignmentInfo[i].status); 
     } 

     return Ok(dataContainer); 
    } 

錯誤

<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> 
     <ExceptionMessage> 
      Type    'System.Data.Entity.DynamicProxies.staff_info_486D5E50524E69EE7794DA605D95FD2D9B861D9FD9D12B6E6415A49FD7317333' with data contract name 'staff_info_486D5E50524E69EE7794DA605D95FD2D9B861D9FD9D12B6E6415A49FD7317333:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver if you are using DataContractSerializer 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 the serializer. 
     </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 WriteArrayOfstaff_infoToXml(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.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content) at System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__14.MoveNext() 
     </StackTrace> 
     </InnerException> 
    </Error> 
+1

請問您可以在問題中添加完整的錯誤。 –

+0

我更新了錯誤 – user3902467

+0

您是否嘗試將'GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);'添加到global.asax文件? –

回答

0

我在m個具有圓形參考y型號。使用[JsonIgnore]解決了這個問題。

+0

你添加[JsonIgnore]到那麼什麼?你要返回一個字符串字典,這兩個類都不是由你寫的。 – Robba

+0

我將它添加到assignStaffEntities中調用的模型中。 – user3902467

+0

啊等一下,你在Getstaff_info()方法上出錯了......這不是我所期望的。很高興看到你解決了它 – Robba