使用MVC 5 API Controller检索具有相关实体的实体时出错

时间:2014-02-08 01:40:09

标签: c# asp.net-mvc entity-framework

我有一个API控制器,可以检索一个运行良好的文章列表。我为我的文章创建了一个DTO类,我的API控制器使用它,其中包含相关对象列表(标签)。

以下代码效果很好,并检索我的文章列表:

public class ArticleDTO
{

    public int ArticleID { get; set; }

    public string Title { get; set; }

    public DateTime DatePublished { get; set; }

    [AllowHtml]
    public string Body { get; set; }

    public  ICollection<Tag> Tags { get; set; }
}

我的API控制器(注意我在linq查询中没有包含标签):

    private IQueryable<ArticleDTO> MapArticles()
    {
        return from p in db.Articles.Include("Tags")
               select new ArticleDTO() {    
                   ArticleID=p.ArticleID,
                   Title = p.Title,
                   Subheading = p.Subheading,
                   DatePublished = p.DatePublished,
                   Body = p.Body,
               };
    }

    public IEnumerable<ArticleDTO> GetArticles()
    {
        return MapArticles().AsEnumerable();
    }

但是,如果我包含标签:

select new ArticleDTO() {    
    ArticleID=p.ArticleID,
    Title = p.Title,
    Subheading = p.Subheading,
    DatePublished = p.DatePublished,
    Body = p.Body,
    Tags = Tags
};

然后我收到以下消息:

'ObjectContent`1'类型无法序列化内容类型'application / xml的响应主体;字符集= UTF-8' 。

类型'System.Data.Entity.DynamicProxies.Tag_5E08D5046E177BA781B97E38A79F1E2BCC3300645A0E505002547644006F116E',数据合约名称为“Tag_5E08D5046E177BA781B97E38A79F1E2BCC3300645A0E505002547644006F116E:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies”不是预期的。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

我不知道这意味着什么或如何解决它,所以非常感谢任何帮助!

...谢谢

1 个答案:

答案 0 :(得分:1)

它正在尝试序列化Tags集合,但它由代理组成。你可以做的就是拥有一个TagDTO,这样你就可以确定你要检索的内容了:

select new ArticleDTO() {    
    ArticleID=p.ArticleID,
    Title = p.Title,
    Subheading = p.Subheading,
    DatePublished = p.DatePublished,
    Body = p.Body,
    Tags = Tags.Select(t => new TagDTO {
                                         Name = t.Name
                                       })
    };