2015-04-01 51 views
1

我偶然發現在使用實體框架和PostgreSql時的意外行爲。PostgreSql EF,導航屬性在查詢時始終爲空

當我用where子句中的導航屬性查詢上下文時,其始終爲空並且失敗。但是,如果我添加有很多,包括方法指向導航屬性格式它的工作

這將工作

context.Garages.Include("PostalCode").Where(f=>f.PostalCode.RegionId == regionId) 

這不會(郵編爲null,未能在NullReference)

context.Garages.Where(f=>f.PostalCode.RegionId == regionId) 

我不認爲我不得不在使用MSSQL時添加這個查詢。 anybdoy可以向我解釋這一點。

回答

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。另一方面,如果您使用Lazy Loading,則相關實體將在第一次訪問時加載,即您要查找的行爲。