首页 > 解决方案 > 使用第二个数据库调用刷新/更新实体框架导航属性数据

问题描述

来自 EF 的查询会产生一个复杂的实体,该实体具有很少的关联属性,并且有些为空。当我调用 DB 来获取那些关联的复杂对象的详细信息时,EF 将数据泵入我的第一个集合中,其中之前的数据为空。并且在转换为 JSON 时会导致自引用问题。

假设一个学生有很多课程,而课程有讲师。并且一门课程也有学生名单。当我得到一个学生的课程时,它会给我一个student.Courses为空的学生课程的集合。现在,当我从 DB 获得所有课程的集合时。student.Courses现在不再为空。它有一个课程列表。

我有 2 个问题

  1. 如何以不更新集合的方式控制此行为。
  2. 如何避免自引用问题。

我在 dot-net core 3 上。我已经SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;准备好了。

我想避免 EF 执行以下操作

Entity Framework Core 将自动修复先前加载到上下文实例中的任何其他实体的导航属性。因此,即使您没有明确包含导航属性的数据,如果之前加载了部分或所有相关实体,该属性仍可能会被填充。参考

标签: asp.netentity-framework.net-coreef-core-3.0

解决方案


如何以不更新集合的方式控制此行为。

使用无跟踪查询加载您的实体。

当结果用于只读方案时,没有跟踪查询很有用。它们执行速度更快,因为无需设置更改跟踪信息。如果您不需要更新从数据库中检索到的实体,则应使用无跟踪查询。您可以将单个查询交换为不跟踪。

var blogs = context.Blogs
    .AsNoTracking()
    .ToList();

您还可以在上下文实例级别更改默认跟踪行为:

context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

var blogs = context.Blogs.ToList();

https://docs.microsoft.com/en-us/ef/core/querying/tracking


推荐阅读