考虑一个具有Order
和OrderLines
表以及它们之间一对多关系的数据库(这是针对MCVE的;实际上下文更为复杂)。如果我搭建模型,则会得到以下信息:
public partial class Order {
public virtual ICollection<OrderLines> OrderLines {get; set;}
}
和
public partial class OrderLines {
public virtual int OrderId {get; set;}
public virtual Order Order {get; set;}
}
现在,如果我生成OrdersController,则GET方法也非常简单:
[HttpGet]
public ActionResult<IEnumerable<Order>> Order() {
return _context.Order.ToList();
}
我得到了一个不错的JSON字符串作为回报。但是,如果我将Include()添加到get方法中,如下所示:
return _context.Order.Include(o => o.OrderLines).ToList();
结果字符串在中间被切掉。当我调试时,程序似乎陷入了从OrderLines到Order然后再回到OrderLines的无限循环。如果我从Order
中删除OrderLines
变量,而只离开OrderId
,那么一切都会正常(这支持了我关于无限循环的假设)。
显然,这是一个原始的例子;我应该使用ViewModel-但是,上面的代码仍然无效吗?我已经好几年没有使用Include()了,但是我可以肯定的是,在早期版本的EF中,它运行良好。
推荐的获取对象及其子对象的方式是什么?
答案 0 :(得分:1)
您的输出对象具有默认情况下不会序列化的循环引用。
在您的启动类中,找到第services.AddMvc()
行,并进行如下更新:
services.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings.ReferenceLoopHandling =
Newtonsoft.Json.ReferenceLoopHandling.Ignore;
})
检查this link了解更多信息。