ASP.net的Web API响应 - 循环数据(ASP.net Web api response

2019-10-20 17:42发布

使用IAM ADO.net在我的MVC应用5我ORM工具,而问题是:

  • 当我做一些POST操作到我的网页API,返回一些数据,我响应JSON具有forign键的所有值,但我并没有包括一些数据。

看看这个简单的一行:

    public async Task<IHttpActionResult> GetMyMessage(int id)
    {

        List<Messages> messages = await db.Messages.Where(a => a.GroupID == id).ToListAsync();


        return Ok(messages);

    }

问题就在这里,我没有任何inclued数据(例如db.Messages.Include(东西...))到我的邮件,但还是老样子响应我得到例如,所有用户的集合,而我的消息表与连接其他的东西在DB。

我的全球ASAX是:

protected void Application_Start()
    {

        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

    }

没有人知道如何摆脱掉这个链接表和有干净的JSON响应。 否则,我会做一些变通方法,并进行清洁了一下。 ?

Answer 1:

这听起来像的ViewModels的情况下。 而不是返回你的Message的实体,您可以创建一个新的类型,只有你关心的是结果的属性。 说你的实体是这样的:

public class Message {
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual User User { get; set; }
    public virtual Group Group { get; set; }
}

public class User {
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Message> Messages { get; set; }
}

public class Group {
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Message> Messages { get; set; }
}

你有检索端点Message由组ID,但不希望对任何信息UserGroup 。 创建一个视图模型来表示你想要的实际响应:

public class MessageViewModel {
    public int Id { get; set; }
    public string Name { get; set; }
}

然后转换实体视图模型:

public async Task<IHttpActionResult> GetMyMessage(int id)
{
    var messages = await db.Messages.Where(a => a.Group.Id == id).ToListAsync();
    var models = messages.Select(
        m => new MessageViewModel {
            Id = m.Id, 
            Name = m.Name
        }).ToList();

    return Ok(models);
}

而现在像下面这样返回:

[{id: 1, name: 'SomeMessageName'}, {id: 2, name: 'SomeOtherMessageName'}, ...]


Answer 2:

你应该为你的背景下禁用延迟加载。 我认为,当你想返回主对象序列化相关实体被加载。

从MSDN例如:

public class MyContext : DbContext
{
    public MyContext()
    {
        this.Configuration.LazyLoadingEnabled = false;
    }
}


文章来源: ASP.net Web api response - looping data