在代码拳模式下创建的EntityFramework类的导航属性的值始终为null

时间:2016-10-21 01:24:50

标签: c# asp.net .net entity-framework visual-studio

我是EntityFramework的初学者。以下代码是从我的项目中提取的。

MERGE_HEAD

上面的Main方法的运行结果显示为true,也就是说,属性WorkExperiences.Person的值始终为null。但我已将数据插入表中。

如何让属性WorkExperiences.Person加载引用的键值?提前感谢您的帮助。

1 个答案:

答案 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; }