asp.net - 使用第二个数据库调用刷新/更新实体框架导航属性数据
问题描述
来自 EF 的查询会产生一个复杂的实体,该实体具有很少的关联属性,并且有些为空。当我调用 DB 来获取那些关联的复杂对象的详细信息时,EF 将数据泵入我的第一个集合中,其中之前的数据为空。并且在转换为 JSON 时会导致自引用问题。
假设一个学生有很多课程,而课程有讲师。并且一门课程也有学生名单。当我得到一个学生的课程时,它会给我一个student.Courses
为空的学生课程的集合。现在,当我从 DB 获得所有课程的集合时。student.Courses
现在不再为空。它有一个课程列表。
我有 2 个问题
- 如何以不更新集合的方式控制此行为。
- 如何避免自引用问题。
我在 dot-net core 3 上。我已经SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
准备好了。
我想避免 EF 执行以下操作
Entity Framework Core 将自动修复先前加载到上下文实例中的任何其他实体的导航属性。因此,即使您没有明确包含导航属性的数据,如果之前加载了部分或所有相关实体,该属性仍可能会被填充。参考
解决方案
如何以不更新集合的方式控制此行为。
使用无跟踪查询加载您的实体。
当结果用于只读方案时,没有跟踪查询很有用。它们执行速度更快,因为无需设置更改跟踪信息。如果您不需要更新从数据库中检索到的实体,则应使用无跟踪查询。您可以将单个查询交换为不跟踪。
var blogs = context.Blogs
.AsNoTracking()
.ToList();
您还可以在上下文实例级别更改默认跟踪行为:
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var blogs = context.Blogs.ToList();
推荐阅读
- pdf - 生成 ToUnicode CMap(以编程方式或可视方式)
- python-3.7 - 阅读之间
MDF文件中的标签? - python - python中带有动态if语句的for循环
- mysql - Mysql在不同的行和不同的列中选择相同的值
- sql - 左连接中的重复行
- ios - 尝试将日期格式化程序类型(从时间选择器)转换为整数
- linux - 使用正确密码拒绝 SSH 权限。最近在 VS 代码上安装了远程 SSH 扩展,我觉得它搞砸了
- reactjs - 使用 React 函数预览图像上传
- linux - 如何使用 make 编译但还包含所有依赖项
- java - java.time.format.DateTimeParseException:无法在索引 0 处解析文本“06/05/2019”