在使用Entity Framework和PostgreSql时,我偶然发现了意外行为。
当我在where子句中查询带有导航属性的上下文时,它始终为null并且失败。但是,如果我添加指向导航属性的Include方法,它正在工作
这将起作用
context.Garages.Include("PostalCode").Where(f=>f.PostalCode.RegionId == regionId)
这不会(PostalCode为null并且在NullReference上失败)
context.Garages.Where(f=>f.PostalCode.RegionId == regionId)
我不认为在使用MSSQL时我必须将其添加到查询中。 anybdoy可以向我解释一下。
答案 0 :(得分:0)
如果您希望导航属性为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。另一方面,如果您使用延迟加载,则相关实体将在第一次访问时加载,这是您要查找的行为。