Serializacja obiektów Entity Framework za pomocą relacji jeden do wielu
Próbuję użyć EF z Code First i Web API. Nie mam żadnych problemów, dopóki nie zacznę serializować relacji wiele-do-wielu. Gdy próbuję wykonać poniższą metodę web api poniżej, otrzymuję następujący komunikat o błędzie:
public class TagsController : ApiController
{
private BlogDataContext db = new BlogDataContext();
// GET api/Tags
public IEnumerable<Tag> GetTags()
{
return db.Tags.AsEnumerable();
}
}
Otrzymuję następujący błąd:
'System.Data.Entity.DynamicProxies.Tag_FF17EDDE6893000F7672649A39962DB0CA591C699DDB73E8C2A56203ED7C7B6D' z nazwą kontraktu danych 'Tag_FF17EDDE6893000F7672649A39962DB0CA591C699DDB73E8C2A56203ED7C7B6D:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies„nie oczekuje się. Rozważ użycie DataContractResolver lub dodaj dowolne typy nieznane statycznie do listy znanych typów - na przykład za pomocą atrybutu KnownTypeAttribute lub dodając je do listy znanych typów przekazanych do DataContractSerializer.
Przeczytałem kilka artykułów SO (artykuł 1, artykuł 2), że poprawka polega na dodaniu następującego atrybutu:
[DataContract (IsReference = true)]
ale to nie przyniosło skutku. Również użycie [IgnoreDataMember] nie działa. Jedyną opcją, która wydaje się działać, jest ustawienie Configuration.ProxyCreationEnabled na false. Czy to moja jedyna opcja? Czy czegoś mi brakuje?
Przykładowe obiekty POCO:
Etykietka
[DataContract(IsReference = true)]
public class Tag
{
public Tag()
{
this.Blogs = new HashSet<Blog>();
}
[Key]
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[IgnoreDataMember]
public virtual ICollection<Blog> Blogs { get; set; }
}
Blog
[DataContract(IsReference = true)]
public class Blog
{
public Blog()
{
this.Tags = new HashSet<Tag>();
}
[Key]
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[IgnoreDataMember]
public virtual ICollection<Tag> Tags { get; set; }
}