使用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”项中的地址被加载。
为什么呢?我可以避免这个吗?
我正在创建一些测试,这是我想避免的行为。
答案 0 :(得分:1)
为什么?
因为默认情况下返回实体类型的查询是Tracking queries,这意味着您的案例中的Person
对象实例在两个调用之间由相同的上下文共享。并且因为它们是引用类型,后面的查询所加载的信息在前者的结果中也是可见的。
我可以避免这个吗?
您可以使用No-tracking queries:
var a = context.Persons.AsNoTracking().ToList();