【问题标题】:Error when retrieving entities with related entities using MVC 5 API Controller使用 MVC 5 API 控制器检索具有相关实体的实体时出错
【发布时间】:2014-02-08 01:40:09
【问题描述】:

我有一个 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;”的响应正文; charset=utf-8'。

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

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

谢谢...

【问题讨论】:

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


    【解决方案1】:

    它试图序列化标签集合,但它是由代理组成的。你可以做的是也有一个 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
                                           })
        };
    

    【讨论】:

    • 谢谢,这很有意义。在您有 Tags.Select 的地方,我收到一个错误,即当前上下文中不存在标签。
    • 好的,现在已修复,我将 ArticleDTO 模型更改为查看 TagDTO 而不是 Tag,并将我遇到问题的行更改为:Tags = p.Tags.Select(t => new TagDTO { Name = t.Name }).ToList()
    猜你喜欢
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    相关资源
    最近更新 更多