我正在尝试将 EF 与 Code First 和 Web API 一起使用。在我开始序列化多对多关系之前,我没有任何问题。当我尝试执行下面的以下 web 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_FF17EDDE6893000F7672649A39962DB0CA591C699DDB73E8C2A56203ED7C7B6D http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies预计不会”。考虑使用 DataContractResolver 或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。
我已经阅读了一些 SO 文章(文章 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; }
}