Serialización de objetos de Entity Framework con una a muchas relaciones
Estoy intentando usar EF con Code First y la API web. No tengo ningún problema hasta que empiece a serializar las relaciones de muchos a muchos. Cuando intento ejecutar el siguiente método de api web, aparece el siguiente mensaje de error:
public class TagsController : ApiController
{
private BlogDataContext db = new BlogDataContext();
// GET api/Tags
public IEnumerable<Tag> GetTags()
{
return db.Tags.AsEnumerable();
}
}
Obtuve el siguiente error:
'System.Data.Entity.DynamicProxies.Tag_FF17EDDE6893000F7672649A39962DB0CA591C699DDB73E8C2A56203ED7C7B6D con el nombre del contrato de datos' Tag_FF17EDDE6893000F7672649A3Paque en la caja de la tarjeta de la tarjeta de la tarjeta de la tarjeta de la computadora de la manohttp://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' no se esperaba. Considere usar un DataContractResolver o agregue cualquier tipo que no se conozca estáticamente a la lista de tipos conocidos, por ejemplo, usando el atributo KnownTypeAttribute o agregándolos a la lista de tipos conocidos que se pasaron a DataContractSerializer.
He leído algunos artículos de SO (Articulo 1, Artículo 2) que la solución es agregar el siguiente atributo:
[DataContract (IsReference = true)]
pero esto no ha tenido efecto. También el uso de [IgnoreDataMember] no tiene un efecto. La única opción que parece funcionar es establecer Configuration.ProxyCreationEnabled en false. Es esta mi única opción? ¿Me estoy perdiendo de algo?
Ejemplos de objetos POCO:
Etiqueta
[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; }
}