在Web API Controller中序列化EF Code First 5.0数据时出错

时间:2012-04-06 03:01:54

标签: ef-code-first asp.net-web-api entity-framework-5

我原先问过这个问题: How Do I Resolve "A specified Include path is not valid"?已经回答了,而我的.Include()现在正在工作,但是,当序列化程序尝试使用它时,我会收到以下错误:

You must write an attribute 'type'='object' after writing the attribute 
with local name '__type'.

以下是我正在做的返回数据:

var everything = dc.Categories
            .Include(c => c.Products);

我的课程定义相当简单:

public class Category
{
    public int CategoryId { get; set; }
    public string Title { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public string Title { get; set; }

    public virtual Category Category { get; set; }
}

public class ProductDataContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

我也尝试删除'virtual',但后来我得到循环引用。我尝试将ICollection产品上的setter设为私有(如此处所示:http://forums.asp.net/t/1773164.aspx/1),这样可以清除错误,但我的产品不是返回的JSON的一部分。

我需要做些什么才能使数据与类别及其产品一起序列化?

修改 这是我得到的堆栈跟踪:

[SerializationException: Object graph for type &#39;System.Collections.Generic.List`1[[Test.Models.Product, Test.Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]&#39; contains cycles and cannot be serialized if reference tracking is disabled.]
System.Web.Http.WebHost.HttpControllerHandler.EndProcessRequest(IAsyncResult result) +30206
System.Web.Http.WebHost.HttpControllerHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +10
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9478661
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously) +178

1 个答案:

答案 0 :(得分:13)

为了解决这个问题,我需要:

  1. 禁用延迟加载和
  2. 使用IgnoreDataMember中的System.Runtime.Serialization作为Category导航属性的属性(Product类的反向引用)。
  3. 希望这有助于某人。

    为了解决XML-ish错误,我从这里使用了帮助: http://www.strathweb.com/2012/03/serializing-entity-framework-objects-to-json-in-asp-net-web-api/

    为了解决循环引用的问题,我以此为指导: MVC 4, Upshot entities cyclic references