实体框架查询正在将子属性加载到另一个变量中。为什么?

时间:2016-07-19 18:48:46

标签: entity-framework entity-framework-core

使用Entity Framework Core(7)我有以下实体:

public class Person {
  public Int32 Id { get; set; }
  public virtual Address Address { get; set; }
}

public class Address {
  public Int32 PersonId { get; set; }
  public String City { get; set; }
}

然后我在第二行用断点运行以下查询。

List<Context.Person> a = context.Persons.ToList();

List<Context.Person> b = context.Persons.Include(x => x.Address).ToList();

当我检查变量“a”时,每个列表项中的地址为空,这是有意义的,因为我没有在第一个查询中包含地址。

然后我允许第二个查询运行,我看到“b”列表项中的地址有一个不同于null的地址,这也是有意义的,因为我包括它。

奇怪的是,在我运行“b”后,“a”项中的地址被加载。

为什么呢?我可以避免这个吗?

我正在创建一些测试,这是我想避免的行为。

1 个答案:

答案 0 :(得分:1)

  

为什么?

因为默认情况下返回实体类型的查询是Tracking queries,这意味着您的案例中的Person对象实例在两个调用之间由相同的上下文共享。并且因为它们是引用类型,后面的查询所加载的信息在前者的结果中也是可见的。

  

我可以避免这个吗?

您可以使用No-tracking queries

var a = context.Persons.AsNoTracking().ToList();