我正在尝试使用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 对象:
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; }
}
博客
[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; }
}
IgnoreDataMember
没有效果的原因是问题出在代理生成上,而不是Tags
集合的序列化。 - Ryan Amies