问题:我使用LINQ查询关系数据库的实体框架上下文。根据EFCore Relationships,我创建了一个包含一些关系的数据库,但当我使用ASP.NET将数据发送到服务器时,这些关系的值为null。
经过进一步的挖掘,我发现我需要使用_context.Post.Include("Blog")
来发送数据,因为它使用延迟加载。然而,通过这样做,它在JsonResult中创建了一个"无限循环"。
最终返回的数据似乎被切成了两半,加载它时我会遇到JSON解析错误,因为它缺少JSON数据的后半部分。
示例返回值
{"id": 0, "blogId": 1, "blog": {"postId":0
这就是它返回的全部内容,因为postId之后的任何内容都将是对原始帖子的引用,而原始帖子又引用了博客。有没有什么方法可以让我使用LINQ来排除返回中的post对象,类似于博客最初的包含方式?
这是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);