我可以将Include()与典型的实体框架一对多模型一起使用吗?

时间:2018-11-24 18:55:18

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

考虑一个具有OrderOrderLines表以及它们之间一对多关系的数据库(这是针对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中,它运行良好。

推荐的获取对象及其子对象的方式是什么?

1 个答案:

答案 0 :(得分:1)

您的输出对象具有默认情况下不会序列化的循环引用。

在您的启动类中,找到第services.AddMvc()行,并进行如下更新:

services.AddMvc()
    .AddJsonOptions(options => {
        options.SerializerSettings.ReferenceLoopHandling =
            Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    })

检查this link了解更多信息。