我是EntityFramework的初学者。以下代码是从我的项目中提取的。
MERGE_HEAD
上面的Main方法的运行结果显示为true,也就是说,属性WorkExperiences.Person的值始终为null。但我已将数据插入表中。
如何让属性WorkExperiences.Person加载引用的键值?提前感谢您的帮助。
答案 0 :(得分:0)
实体框架不会自动加载关联的实体,除非您专门查询它们。原因是如果您总是加载所有导航属性,加载远远超出您的预期 - 您可能最终会拉大部分如果您有很多关系,即使是简单的查询,您的数据库也会回来。想象一下,如果你去了亚马逊,它会对您的订单进行查询,然后包含这些订单中的所有产品,然后包括这些产品的所有卖家,然后包括这些卖家的所有产品,......
实体框架为您提供了几种控制何时加载相关数据的技术。
您可以使用DbExtensions.Include()强制它包含与原始查询相关的实体,这意味着一次访问数据库:
Console.Write(context.WorkExperiences.Include(w => w.Person).First().Person == null);
或者,您可以使用.Load()强制加载未加载的实体:
var firstWE = context.WorkExperiences.First();
firstWE.Reference("Person").Load();
Console.Write(firstWE.Person == null);
或者您可以启用延迟加载,这将使您在第一次访问该属性时按需加载。您可以通过向其添加虚拟来实现此目的(这使EF能够向您的属性添加一些代码并按需加载):
public virtual Person Person { get; set; }