使用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响应。 否则,我会做一些变通方法,并进行清洁了一下。 ?
这听起来像的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,但不希望对任何信息User
或Group
。 创建一个视图模型来表示你想要的实际响应:
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'}, ...]
你应该为你的背景下禁用延迟加载。 我认为,当你想返回主对象序列化相关实体被加载。
从MSDN例如:
public class MyContext : DbContext
{
public MyContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
}