C# 我可以将Include()用于典型的实体框架一对多模型吗?

C# 我可以将Include()用于典型的实体框架一对多模型吗?,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,考虑一个数据库,其中包含Order和OrderLines表以及它们之间的一对多关系(这是针对MCVE的;实际上下文更复杂)。如果我搭建模型,我会得到以下结果: public partial class Order { public virtual ICollection<OrderLines> OrderLines {get; set;} } 现在,如果我生成OrdersController,GET方法也非常简单: [HttpGet] public ActionResult

考虑一个数据库,其中包含
Order
OrderLines
表以及它们之间的一对多关系(这是针对MCVE的;实际上下文更复杂)。如果我搭建模型,我会得到以下结果:

public partial class Order {
    public virtual ICollection<OrderLines> OrderLines {get; set;}
}
现在,如果我生成OrdersController,GET方法也非常简单:

[HttpGet]
public ActionResult<IEnumerable<Order>> Order() {
    return _context.Order.ToList();
}

中间生成的字符串。当我调试时,程序似乎进入了从订单行到订单行再到订单行的无限循环。如果我从

OrderLines
中删除
Order
变量,只保留
OrderId
,一切正常(这支持了我关于无限循环的假设)

显然,这是一个有点原始的例子;我应该使用ViewModel,但上面的代码不是有效的吗?我已经好几年没有使用Include(),但我很确定在EF的早期版本中它工作得很好


获取对象及其子集合的建议方法是什么?

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

在startup类中,找到行
services.AddMvc()
,并按如下方式进行更新:

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

查看更多信息

永远不要返回实体框架查询,总是先具体化抱歉-在剪切和粘贴过程中我错过了
ToList()
。Updated@CamiloTerevinto-我在谷歌上搜索各种关键词,而你提到的问题从未出现过。另外,由于某种原因,我没有得到任何错误。所以,虽然我同意这个问题提供了正确的答案,但我建议我的问题保持开放…:)关于重复的问题,答案出现在其他几个问题中,然而,这个问题是从不同的角度提出的。很多人都被困在这个阶段,我看不到有这个问题的人找到解决方案。事实上,问题是一样的。上述问题是您面临问题的常见场景。这种情况不能真正与问题联系起来。第一次也花了我一段时间。以这种形式提出问题是有意义的,这样可以帮助其他人尽快找到解决方案!我正在读那个页面,但只是通过急切和显式加载(显式加载实际上也很有效);但是忽略了延迟加载,因为它不适用于我。。。谢谢,我不会要求你使用延迟加载。我认为这不适用于实际应用程序。这只是一条捷径。我提供了链接,因为它在页面底部包含相同的代码。。。我是说我停止了惰性加载,错过了下面的解释。好的是,我得到了一个完美的答案,这让我有一天没有得到;虽然我投了两张反对票。。。哦,好吧
    return _context.Order.Include(o => o.OrderLines).ToList();
services.AddMvc()
    .AddJsonOptions(options => {
        options.SerializerSettings.ReferenceLoopHandling =
            Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    })