Entity Framework Core 禁用 .Include() 函数中信息的递归检索

2024-02-10

该数据库包含表 Machines、Wheels、Characteristics 和 Pilot。汽车的 1 条记录包括 1 条关于 Pilot 的记录、4 条关于车轮和几个特性的记录。在我的模型类中,它看起来像这样:

public class Machines
{
    public int Id { get; set; }
    public string Description { get; set; }
    public string Color { get; set; }
    public int Weight { get; set; }
    public int Param { get; set; }

    public List<Characteristics> characteristics { get; set; }
    public List<Wheels> wheels { get; set; }
    public Pilot pilot { get; set; }
}
public class Characteristics
{
    public int Id { get; set; }
    public string Parameter { get; set; }
    public string Value { get; set; }
    public string Description { get; set; }

    public int MachineId { get; set; }
    [ForeignKey("MachineId")]
    public Machines machine{ get; set; }

}
public class Wheels
{
    public int Id { get; set; }
    public int Radius { get; set; }
    public int Weight { get; set; }
    public int MachineId { get; set; }

    [ForeignKey("MachineId")]
    public Machines machine{ get; set; }
}
public class Pilot
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; } 
    public int MachineId { get; set; }

    [ForeignKey("MachineId")]
    public Machines machine{ get; set; }
}

当我尝试下载有关机器的完整信息时,如下所示:

 var car  = context.Machines.Where(x => x.Id == 2)
                        .Include(m=> m.Wheels)
                        .Include(m=>m.Charateristics)
                        .Include(m=>m.Pilot)
                        .FirstOrDefault();

作为回应,我得到了一辆包含一名飞行员、一系列所有特征和一系列车轮的汽车。但与此同时,车轮数组再次包含有关汽车的信息,其中包括有关车轮的信息(但第二次没有汽车)。

它看起来像这样:

{
"id": 2,
"Description": "",
"Color": "red",
"Weight": 2000,
"Pilot": {
    "id": 1,
    "Name": "John",
    "Description": ""
}, 
"Wheels": [
    {
        "id": 7,
        "Radius": 14,
        "Weight": 5,
        "MachineId": 2, 
        "machine": {
            "id": 2,
            "Description": "",
            "Color": "red",
            "Weight": 2000,
            "Pilot": {
                "id": 1,
                "Name": "John",
                "Description": ""
            }, 
            "Wheels": [
                {
                    "id": 7,
                    "Radius": 14,
                    "Weight": 5,
                    "MachineId": 2
                },
...

如何在没有递归数据的情况下获取信息?

此外,该请求需要很长的时间(比 4 个单独的请求长得多)。这微软网站 https://learn.microsoft.com/en-us/ef/ef6/querying/related-data#turn-off-lazy-loading-for-all-entities说如果删除 virtual 关键字,您可以禁用下载。我清理过,但没有帮助。同样在上下文中,我规定this.ChangeTracker.LazyLoadingEnabled = false;但这也没有帮助。

我还看到很多提到使用 .Load() 函数可以加快请求的执行速度,但我不太明白如何在我的情况下使用它。

UPDATE

由于每个人都建议我包含 Newtonsoft.Json.ReferenceLoopHandling.Ignore,我将提供我的启动文件和上下文文件。事实上,我已经启用了此功能。在添加此内容之前,我根本无法发送响应,添加后,它开始按照我的指示发送(请参阅上面的 JSON 响应)。

我的背景:

    public DbSet<Machines> machines{ get; set; }
    public DbSet<Characteristics> characteristics{ get; set; }
    public DbSet<Wheels> wheels{ get; set; }
    public DbSet<Pilot> pilot{ get; set; }

    public dbContext(DbContextOptions<dbContext> options) : base(options)
    {
        this.ChangeTracker.LazyLoadingEnabled = false;
    }

我的创业:

public void ConfigureServices(IServiceCollection services)
{
   ...

   services.AddDbContext<dbContext>(options => { 

        options.UseMySql(Configuration.GetConnectionString("DefaultConnection"), 
        builder =>
        {
            builder.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null);
        });
        }); 

        services.AddControllers().AddNewtonsoftJson(x =>
 x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

}

对于 asp.net core 2.x,您可以在 Startup.cs 中使用以下代码:

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

对于asp.net core 3.x,需要先安装Microsoft.AspNetCore.Mvc.NewtonsoftJson然后使用以下代码:

services.AddControllers().AddNewtonsoftJson(options =>
{
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Entity Framework Core 禁用 .Include() 函数中信息的递归检索 的相关文章

随机推荐

  • Java 中的 Swagger 规范验证

    我正在尝试验证一些可能包含 swagger 规范的字符串 我正在尝试使用 swagger 解析器 下面的代码不起作用 我只收到消息 属性不是类型object swagger 规范是从 xml 文件中读取的 swaggerXml nodeLi
  • Webpack - 加载块 0 失败

    我的一些用户收到此错误 未处理的拒绝消息 加载块 0 失败 堆栈 正在加载 块 0 在 HTMLScriptElement n 处失败 问题是 我没有成功复制它 我已经有一段时间出现这个错误了 对于相同的用户来说 every他们进入网站的时
  • 如何在 Laravel 5 迁移中向表(而不是列)添加注释?

    如何在 Laravel 5 迁移中向表 或列 添加注释 我目前知道如何向列添加评论 例如 table gt tinyInteger status gt comment 0 requested 1 rejected 1 confirmed 但
  • 我打开的文档(选项卡)在 VS2010 SP1 中不断消失

    在 VS 2010 中 当我关闭解决方案并在第二天重新打开它后 我打开的所有文档仍然会打开 正是我想要的 安装 SP1 后 每次打开解决方案时 所有文档都会关闭 无论我将它们保留在什么状态 这是预期的行为 错误还是存在我不知道的设置 我怎样
  • Google App Script - 合并多个文档,删除所有换行符并通过电子邮件以 pdf 形式发送

    我正在使用 Google App Script 并已成功将一个文件夹中的多个文档合并到一个文档中 并删除所有换行符 同时保持所有样式不变 我需要一些帮助的是 在removeMultipleLineBreaks element 函数完成后如何
  • 如何使用 Angular 或 Node JS 在现有 Excel 文件中写入

    我实际上陷入困境 我正在一个平均堆栈中工作 并且我的项目要求在现有的微控制器中写入数据 以启用经过验证的 Excel 工作表 我做了很多谷歌 但我没有找到任何节点或角度模块满足我的要求 每个人都给我创建新文件的选项 没有人给我更新现有 Ex
  • 如何修复因不允许的用户代理而导致的功能受损?

    我正在构建一个网络浏览器 最近在尝试使用我的 Google 帐户在网站上登录时遇到错误 这很奇怪 因为我检查了我的应用程序和 Safari 的用户代理 它们都是相同的 有什么建议么 UPDATE WKWebView 在自定义 UIView
  • 如何设置 AsyncStorage 的过期日期 - React Native

    我正在使用 React Native 异步存储 它效果很好 但在某些情况下 我必须设置数据的到期日期并刷新我检查的存储 异步存储文档 https facebook github io react native docs asyncstora
  • 将 jquery 验证添加到 kendo ui 元素

    我已经查看了很多关于此的帖子 并且当我添加以下内容时它确实验证了我的字段 validator setDefaults ignore 我仍然缺少的部分是添加input validation error类来通知用户 它对于我的其他输入元素 非剑
  • 通过 Windows 批处理文件将长命令拆分为多行

    如何在批处理文件中将长命令拆分为多行 您可以使用插入符号分隔长行 只要您记住插入符号及其后面的换行符已被完全删除即可 因此 如果需要在换行处插入一个空格 请添加一个空格 下面详细介绍一下 https stackoverflow com a
  • 地图 std::map< std::string, Stock*> &stocks 上的模板参数无效

    我有声明 或类似声明 std map lt std string Stock gt stocks 贯穿我的代码 Eclipse 不喜欢这样并产生 无效模板参数 错误 库存声明为 class Stock public Stock std st
  • 可编辑组合框文本滚动

    我有一个可编辑的 wpf 组合框 当我输入比其长度长的内容而不是滚动到最后一个字符时 文本将脱离控制并且不可见 有没有什么办法解决这一问题
  • 应用程序在 Android 2.2 (Froyo) 中根本无法启动

    在最近的 Froyo 更新之前 我的应用程序一直运行正常 安装 Android 2 2 SDK 后 我可以编译我的代码 没有任何错误 但是 当我运行它时 它只是强制关闭 这是日志 05 23 10 15 13 463 DEBUG Andro
  • 我可以列出几个键来执行相同的操作吗? [AHK]

    AHK允许绑定按键 就是我们a z每当按下 a 时 都会触发 z 如果我想在按下 a b 或 c 时触发 z 怎么办 我显然可以重复我的代码 a z b z c z 我可能可以使用 Gosub 像 a Gosub abc b Gosub a
  • 列表可以改变吗? [复制]

    这个问题在这里已经有答案了 当我输入以下代码时 x 1 2 4 print x print x id x x 2 5 3 print x print x id x 它给出的输出为 1 2 4 x 47606160 2 5 3 x 47578
  • ActionbarSherlock:长按操作项会显示 Toast?

    长按操作项时 操作项下方会显示不带文本的 Toast 我可以禁用Toast 感谢您 如果您省略标题或指定操作项应与文本一起显示 则长按将不会出现 否则 吐司会添加每个操作项代表的内容的说明
  • 如何理解Process.Threads.Count结果?这个变量显示什么?

    让我们编写简单的控制台应用程序 调试模式 static void Main string args Process p Process GetCurrentProcess IList
  • Django / Python:捕获 MySQL IntegrityError

    在 Django Python 中 如何捕获特定的 mySQL 错误 IntegrityError try cursor execute sql except IntegrityError do something 不确定我应该导入什么以及
  • CSS3 性能?向左动画或平移X

    在我制作的 HTML5 CSS3 演示中 我主要使用 CSS 过渡来提高性能 我想知道我的 UI 例如 当前 JQuery 根据鼠标位置操纵容器 Div 的 LEFT 属性 我应该使用transform translateX tx 反而 或
  • Entity Framework Core 禁用 .Include() 函数中信息的递归检索

    该数据库包含表 Machines Wheels Characteristics 和 Pilot 汽车的 1 条记录包括 1 条关于 Pilot 的记录 4 条关于车轮和几个特性的记录 在我的模型类中 它看起来像这样 public class