实体框架序列化错误

时间:2016-11-19 19:33:11

标签: c# entity-framework asp.net-web-api

我正在尝试在我的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 :(得分:0)

我的一个模型中有一个循环引用。使用[JsonIgnore]解决了这个问题。