Code First と Web API で EF を使用しようとしています。多対多の関係をシリアライズするまでは、何の問題もありません。以下の 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' with data contract name 'Tag_FF17EDDE6893000F7672649A39962DB0CA591C699DDB73E8C2A56203ED7C7B6D: http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies ' is not expected. DataContractResolver の使用を検討するか、既知の型のリストに静的に認識されていない型を追加します。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加します。
SO の記事 ( article 1、article 2 ) を読んだことがありますが、修正は次の属性を追加することです。
[データ契約 (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; }
}