我在PostgreSql中使用实体框架时偶然发现了意外行为。
当我在where子句中使用navigation属性查询上下文时,它总是为空并且失败。但是如果我添加了指向导航属性的Include方法,它就可以工作了
这样就行了
context.Garages.Include("PostalCode").Where(f=>f.PostalCode.RegionId == regionId)
这不会(PostalCode为空,在空引用时失败)
context.Garages.Where(f=>f.PostalCode.RegionId == regionId)
我认为在使用MSSQL时不必将此添加到查询中。有什么能解释给我听的吗。
最佳答案
如果希望导航属性lazy loaded,则需要将其声明为virtual
:
public Garage
{
//...
public virtual PostalCode PostalCode {get;set;}
}
在这个link中,如果您想为您的实体启用延迟加载并让实体框架在发生更改时跟踪类中的更改,那么您将找到必须跟随您的实体的条件。
如果该导航属性已经
virtual
,则我认为可能导致该行为的另一个选项是,如果关闭上下文上的延迟加载:public class YourContext : DbContext
{
public YourContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
}
如果调用
Include
方法,则将加载相关实体作为查询的一部分。这种负载行为称为Eager Loading。另一方面,如果使用延迟加载,则相关实体将在第一次访问时加载,这是您要查找的行为。