问题:我正在使用 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 流序列化程序文档中搜索如何解决“循环引用”问题。不同的流序列化器提供不同的解决方案:
配置最大深度
基于引用缓存的历史记录
将特定类型的序列化程序配置为不使用“导航属性”
其他解决方案 - 不要使用流序列化器 - 就地配置序列化器功能。
还有一个 - 使用 DTO 类(没有循环引用)。
您还可以尝试分离实体并将 null 设置为您要忽略的每个导航属性,但这很丑陋,不推荐使用。
扬帆大鱼
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);
- 2 回答
- 0 关注
- 261 浏览
添加回答
举报
0/150
提交
取消
