【问题标题】:Can I use Include() with typical Entity Framework one-to-many model? [duplicate]我可以将 Include() 与典型的实体框架一对多模型一起使用吗? [复制]
【发布时间】:2018-11-24 18:55:17
【问题描述】:

考虑一个包含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 的无限循环。如果我从OrderLines 中删除Order 变量并只留下OrderId,一切正常(这支持了我关于无限循环的假设)。

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

获取对象及其子集合的推荐方法是什么

【问题讨论】:

  • 从不返回实体框架查询,总是先实现
  • 抱歉 - 我在剪切和粘贴过程中错过了 ToList()。更新
  • @CamiloTerevinto - 我正在使用各种关键字进行谷歌搜索,但您提到的问题从未出现过。另外,由于某种原因,我没有收到任何错误。所以,虽然我同意这个问题提供了正确的答案,但我建议保持我的问题开放...... :)
  • 关于重复的问题,答案存在于其他几个问题中,但是,问题来自不同的角度。许多人被困在这个阶段,我没有看到有这个问题的人找到了解决方案
  • 确实问题是一样的。上述问题是您面临问题的常见情况。该场景无法真正与问题联系起来。第一次也花了我一段时间。以这种格式提出问题是有道理的,以帮助其他人更快地找到解决方案

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


【解决方案1】:

您的输出对象有一个默认不会序列化的循环引用。

在你的启动类中,找到services.AddMvc()这一行并更新如下:

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

查看this link 了解更多信息。

【讨论】:

  • 哎哟!我正在阅读该页面,但只是通过急切和显式加载(并且显式加载实际上也可以);但忽略了延迟加载,因为它不适用于我...谢谢
  • 我不会要求你使用延迟加载。我认为这不适用于实际应用。这只是一个捷径。我提供了链接,因为它在页面底部包含相同的代码
  • 明白了...好消息是我得到了一个完美的答案,我想了一天。虽然这花了我两次反对票......哦,好吧
猜你喜欢
  • 2021-12-27
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多