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

问题:我正在使用 LINQ 对关系数据库的实体框架上下文进行查询。与EFCore 关系一起,我创建了一个包含一些关系的数据库,但是当我使用 ASP.NET 将数据发送到服务器时,我得到了这些关系的空值。

稍加挖掘,我发现我需要使用_context.Post.Include("Blog")它来发送数据,因为它使用延迟加载。但是,通过这样做,它在 JsonResult 中创建了一个“无限循环”。

最终返回的数据似乎被减半,加载它时出现 JSON 解析错误,因为它缺少 JSON 数据的后半部分。

示例返回值

{"id": 0, "blogId": 1, "blog": {"postId":0

这就是它返回的所有内容,因为该 postId 之后的任何内容都将是对原始帖子的引用,而原始帖子又是对博客的引用。有什么方法可以使用 LINQ 在返回中排除 post 对象,类似于首先包含博客的方式?


慕工程0101907
浏览 263回答 2
2回答

米琪卡哇伊

这是 JSON 序列化问题。在 JSON 流序列化程序文档中搜索如何解决“循环引用”问题。不同的流序列化器提供不同的解决方案:配置最大深度基于引用缓存的历史记录将特定类型的序列化程序配置为不使用“导航属性”其他解决方案 - 不要使用流序列化器 - 就地配置序列化器功能。还有一个 - 使用 DTO 类(没有循环引用)。您还可以尝试分离实体并将 null 设置为您要忽略的每个导航属性,但这很丑陋,不推荐使用。

扬帆大鱼

固定的!我采用了来自包含关系的数据库的模型,然后使用 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);
打开App,查看更多内容
随时随地看视频慕课网APP