Вопрос по ef-code-first, asp.net-web-api, entity-framework-5 – Ошибка при сериализации данных EF Code First 5.0 в контроллере WebAPI

7

Я изначально задавал этот вопрос: Как я могу решить "Указанный недопустимый путь включения"? на который был получен ответ, и мой .Include () теперь работает, однако, когда сериализатор пытается использовать его магию, я получаю следующую ошибку:

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

Вот что я делаю, чтобы вернуть данные:

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

Мои определения классов довольно просты:

<code>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; }
}
</code>

Я также попытался удалить "виртуальный" но тогда я получаю круговые ссылки. Я попытался сделать установщик для продуктов ICollection закрытым (как предложено здесь:http://forums.asp.net/t/1773164.aspx/1), которая возвращает ошибку, но мои продукты не являются частью возвращаемого JSON.

Что мне нужно сделать, чтобы данные сериализовались с категориями и их продуктами?

EDIT Вот трассировка стека, которую я получил:

<code>[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
</code>
Что такое трассировка стека? SLaks
... и еще раз спасибо за вашу помощь @SLaks. MisterJames
Я добавил трассировку стека, а также приведенное ниже решение, выкопал из нескольких других постов и соединил вместе. MisterJames

Ваш Ответ

1   ответ
13

Чтобы это исправить, мне нужно было:

  1. Disable lazy loading, and
  2. Use the IgnoreDataMember from System.Runtime.Serialization as an attribute on the Category navigation property (the back-reference on the Product class).

Надеюсь, это кому-нибудь поможет.

Чтобы обойти ошибки XML-ish, я использовал помощь отсюда: http://www.strathweb.com/2012/03/serializing-entity-framework-objects-to-json-in-asp-net-web-api/

Чтобы обойти проблему с циклическими ссылками, я использовал это как руководство: MVC 4, Upshot лица циклические ссылки

Большое спасибо за ваш ответ! Спас мою жизнь :)
Вы также отключили ProxyCreationEnabled?
Спас мне жизнь х2

Похожие вопросы