为了账号安全,请及时绑定邮箱和手机立即绑定

在数据库查询中使用 .Include() 会创建无限循环的数据

在数据库查询中使用 .Include() 会创建无限循环的数据

C#
慕工程0101907 2022-06-12 11:19:24
问题:我正在使用 LINQ 对关系数据库的实体框架上下文进行查询。与EFCore 关系一起,我创建了一个包含一些关系的数据库,但是当我使用 ASP.NET 将数据发送到服务器时,我得到了这些关系的空值。稍加挖掘,我发现我需要使用_context.Post.Include("Blog")它来发送数据,因为它使用延迟加载。但是,通过这样做,它在 JsonResult 中创建了一个“无限循环”。最终返回的数据似乎被减半,加载它时出现 JSON 解析错误,因为它缺少 JSON 数据的后半部分。示例返回值{"id": 0, "blogId": 1, "blog": {"postId":0这就是它返回的所有内容,因为该 postId 之后的任何内容都将是对原始帖子的引用,而原始帖子又是对博客的引用。有什么方法可以使用 LINQ 在返回中排除 post 对象,类似于首先包含博客的方式?
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

这是 JSON 序列化问题。在 JSON 流序列化程序文档中搜索如何解决“循环引用”问题。不同的流序列化器提供不同的解决方案:

  1. 配置最大深度

  2. 基于引用缓存的历史记录

  3. 将特定类型的序列化程序配置为不使用“导航属性”

其他解决方案 - 不要使用流序列化器 - 就地配置序列化器功能。

还有一个 - 使用 DTO 类(没有循环引用)。

您还可以尝试分离实体并将 null 设置为您要忽略的每个导航属性,但这很丑陋,不推荐使用。


查看完整回答
反对 回复 2022-06-12
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

固定的!我采用了来自包含关系的数据库的模型,然后使用 foreach 来取消反向引用。


var blog = await _context.Blog

    .Include(x => x.Posts)

    .SingleAsync(x => x.Id == id);


foreach (Post post in blog.Posts)

{

    post.Blog = null;

}

return Ok(blog);


查看完整回答
反对 回复 2022-06-12
  • 2 回答
  • 0 关注
  • 261 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号