2012-04-06 14 views
7

Tôi đã hỏi câu hỏi này: How Do I Resolve "A specified Include path is not valid"? đã được trả lời, và .Include() của tôi hiện đang hoạt động, khi serializer cố gắng làm việc đó, tôi nhận được các lỗi sau:Lỗi khi tuần tự hóa Mã EF Dữ liệu đầu tiên 5.0 trong Bộ điều khiển WebAPI

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

đây là những gì tôi đang làm để trả lại dữ liệu:

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

định nghĩa lớp của tôi là khá đơn giản:

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

Tôi cũng đã thử xóa 'ảo' nhưng sau đó tôi nhận được tham chiếu vòng tròn. Tôi đã cố gắng làm cho setter trên sản phẩm ICollection tư nhân (như đề nghị ở đây: http://forums.asp.net/t/1773164.aspx/1), mà được lỗi để xóa, nhưng sau đó sản phẩm của tôi không phải là một phần của JSON trả về.

Tôi cần làm gì để lấy dữ liệu theo thứ tự các danh mục và sản phẩm của chúng trong?

EDIT Dưới đây là stack trace tôi đã nhận được:

[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 
+0

stack trace là gì ? – SLaks

+0

Tôi đã thêm dấu vết ngăn xếp cũng như giải pháp bên dưới, được đào lên từ một vài bài đăng khác và được ghép lại với nhau. – MisterJames

+0

... và cảm ơn bạn đã giúp đỡ @SLaks. – MisterJames

Trả lời

13

Để khắc phục điều này tôi cần phải:

  1. Disable tải lười biếng, và
  2. Sử dụng IgnoreDataMember từ System.Runtime.Serialization dưới dạng thuộc tính trên tài sản điều hướng Category (tham chiếu ngược lại trên Product lớp học).

Hy vọng điều này sẽ giúp ai đó.

Để khắc phục các lỗi XML-ish Tôi đã từng giúp đỡ từ đây: http://www.strathweb.com/2012/03/serializing-entity-framework-objects-to-json-in-asp-net-web-api/

Để khắc phục các vấn đề với các tài liệu tham khảo theo chu kỳ, tôi đã sử dụng điều này như một hướng dẫn: MVC 4, Upshot entities cyclic references

+0

Bạn cũng đã tắt ProxyCreationEnabled chưa? –

+1

Cảm ơn bạn rất nhiều vì câu trả lời của bạn! Đã cứu mạng tôi :) –

+1

Đã cứu mạng tôi x2 –