2016-11-19 6 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

IはMのいずれかに循環参照を持っていましたyモデル。 [JsonIgnore]を使って問題を解決しました。

+0

[JsonIgnore]に何を追加しましたか?あなたは文字列の辞書を返しています、どちらのクラスもあなたによって書かれていません。 – Robba

+0

assignStaffEntitiesで呼び出されたモデルに追加しました。 – user3902467

+0

ああ、待って、あなたは 'Getstaff_info()'メソッドでエラーを取得している...それは私が期待したものではありません。あなたがそれを解決したのを見てよかった – Robba

関連する問題