Сериализация объектов Entity Framework с отношением «один ко многим»
Я пытаюсь использовать EF с Code First и Web API. У меня нет проблем, пока я не начну сериализацию отношений «многие ко многим». Когда я пытаюсь выполнить следующий метод веб-API ниже, я получаю следующее сообщение об ошибке:
public class TagsController : ApiController
{
private BlogDataContext db = new BlogDataContext();
// GET api/Tags
public IEnumerable<Tag> GetTags()
{
return db.Tags.AsEnumerable();
}
}
Я получаю следующую ошибку:
'System.Data.Entity.DynamicProxies.Tag_FF17EDDE6893000F7672649A39962DB0CA591C699DDB73E8C2A56203ED7C7B6D' с именем контракта данных 'Tag_FF17EDDE6893000F7672649A39962DB0CA56B6D7D7D6D7D7R8D3D3R8D3D3103995http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies'не ожидается. Рассмотрите возможность использования DataContractResolver или добавьте любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, переданных в DataContractSerializer.
Я прочитал несколько статей ТАК (Статья 1, статья 2) что исправить это добавить следующий атрибут:
[DataContract (IsReference = true)]
но это не имело никакого эффекта. Также использование [IgnoreDataMember] не имеет эффекта. Единственная опция, которая, кажется, работает, это установить Configuration.ProxyCreationEnabled в false. Это мой единственный вариант? Я что-то пропустил?
Образцы объектов POCO:
Тег
[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; }
}
Блог
[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; }
}