Serialização de objetos do Entity Framework com One to Many Relationship
Eu estou tentando usar o EF com o Code First e a API da Web. Eu não tenho nenhum problema até que eu comecei a serializar relacionamentos Many-to-Many. Quando tento executar o seguinte método de API da web abaixo, recebo a seguinte mensagem de erro:
public class TagsController : ApiController
{
private BlogDataContext db = new BlogDataContext();
// GET api/Tags
public IEnumerable<Tag> GetTags()
{
return db.Tags.AsEnumerable();
}
}
Estou tendo o erro a seguir:
'System.Data.Entity.DynamicProxies.Tag_FF17EDDE6893000F7672649A39962DB0CA591C699DDB73E8C2A56203ED7C7B6D' com nome do contrato de dados 'Tag_FF17EDDE6893000F7672649A39962DB0CA591C699DDB73E8C2A56203ED7C7B6D:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies'não é esperado. Considere usar um DataContractResolver ou adicionar quaisquer tipos não conhecidos estaticamente à lista de tipos conhecidos - por exemplo, usando o atributo KnownTypeAttribute ou adicionando-os à lista de tipos conhecidos passados para DataContractSerializer.
Eu li alguns artigos sobre SO (Artigo 1, artigo 2) que a correção é adicionar o seguinte atributo:
[DataContract (IsReference = true)]
mas isso não teve efeito. Também usando [IgnoreDataMember] não tem efeito. A única opção que parece funcionar é definir Configuration.ProxyCreationEnabled como false. Essa é minha única opção? Estou esquecendo de algo?
Amostra de objetos POCO:
Tag
[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; }
}