我在我的MVC 5应用程序中使用ADO.net作为我的ORM工具,问题是:
看看这个简单的界限:
public async Task<IHttpActionResult> GetMyMessage(int id)
{
List<Messages> messages = await db.Messages.Where(a => a.GroupID == id).ToListAsync();
return Ok(messages);
}
问题在于我没有将任何数据(例如db.Messages.Include(某些东西......))包含到我的消息中但stil作为响应我得到了例如所有用户集合,以及我的其他东西消息表与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响应。否则我将不得不做一些解决方法并清理一下。 ?
答案 0 :(得分:2)
这听起来像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; }
}
您有一个端点,可以按组ID检索Message
,但不希望获得有关User
或Group
的任何信息。创建一个ViewModel来表示您想要的实际响应:
public class MessageViewModel {
public int Id { get; set; }
public string Name { get; set; }
}
然后将实体转换为ViewModel:
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'}, ...]
答案 1 :(得分:1)
您应该为上下文禁用延迟加载。我认为当您要返回的主要对象被序列化时,会加载相关实体。
public class MyContext : DbContext
{
public MyContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
}