问题:我正在使用LINQ向关系数据库查询Entity Framework上下文。跟EFCore Relationships一起,我创建了一个具有一些关系的数据库,但是当我使用ASP.NET将数据发送到服务器时,这些关系的值为空。
经过进一步的挖掘,我发现我需要使用_context.Post.Include("Blog")
来发送数据,因为它使用了延迟加载。但是,通过这样做,它在JsonResult中创建了一个“无限循环”。
最终返回的数据似乎被切成两半,加载时出现JSON解析错误,因为它缺少JSON数据的后半部分。
示例返回值
{"id": 0, "blogId": 1, "blog": {"postId":0
这就是返回的全部内容,因为在该postId之后的所有内容都将是对原始帖子的引用,而原始帖子又具有对博客的引用。有什么方法可以使用LINQ在返回中排除post对象,类似于首先将Blog包含在其中的方式吗?
答案 0 :(得分:1)
这是JSON序列化问题。 在JSON流序列化程序文档中搜索如何解决“循环引用”问题。 不同的流串行器提供不同的解决方案:
其他解决方案-不使用流序列化器-在适当位置配置序列化器功能。
另一个-使用DTO类(没有循环引用)。
您还可以尝试分离实体,并为要忽略的每个导航属性设置null,但这很丑陋,不建议使用。
答案 1 :(得分:0)
已修复!我从数据库中获取了包含关系的模型,然后使用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);