在Entity Framework中有三種加載的方式,分別是延遲加載,自動加載和顯示加載。下面用一個例子來講明:如今有兩個表,一個是資料表(Reference),另一個表是資料分類表(Catalog)。一個資料屬於某一個分類,可是一個分類下能夠包含多個資料。是一個一對多的關係。html
兩個實體類代碼以下:app
public partial class Catalog
{
public Catalog()
{
this.References = new List<Reference>();
}
public string CatalogID { get; set; }
public string CatalogName { get; set; }
public ICollection<Reference> References { get; set; }
}
public partial class Reference
{
public string ReferenceID { get; set; }
public string CatalogID { get; set; }
public string ReferenceName { get; set; }
public virtual Catalog Catalog { get; set; }
}
一、延遲加載。(若是要使用延遲加載,一是Context中的 this.Configuration.LazyLoadingEnabled =true;另外是要求導航屬性前面有virtual關鍵字,任何條件缺一不可);this
List<Reference> refeList = new List<Reference>();//此時只加載了Reference
refeList = dbContext.Set<Reference>().ToList();
Catalog c = refeList[0].Catalog;//此時會自動生成一條Sql語句,查詢這個Referece裏面的Catalog,即實現了延遲加載
二、手動加載,手動加載是在我須要的時候,經過調用Include方法來實現加載的。手動加載不須要任何條件。spa
return dbContext.Set<Reference>().Include("Catalog").ToList();
//能夠直接傳入字段的名稱,也能夠經過lamaba來傳遞,可是使用後一種方法的時候,須要添加using System.Data.Entity;引用
//return dbContext.Set<Reference>().Include(t => t.Catalog).ToList();
手動加載時,是一次性的加載,只生成一條Sql語句,這條Sql語句是同時查詢Reference以及Reference中對應的Catalog 。若是是一對多的關係,有的時候,根本不須要延遲加載,因此通常都把延遲加載關閉掉,在須要使用的時候,經過Include來手動的加載;Include通常適用於一對多的關係時,當讀取多的時候,能夠手動把一的那個實體加載上。好比讀取一個資料時,把這個資料對應的分類實體也讀取出來。可是反過來,通常就不用,通常不多會在讀取分類時,就把這個分類下的全部資料讀取出來,除非是查詢的時候。code
三、顯式的加載,當咱們想在使用的時候,顯式的調用去加載,那麼咱們可使用Entry中的Collection(List)或者Reference(單個實體)去加載;當咱們在讀取一個分類的時候,咱們能夠顯示的去加載,每一個分類裏面的資料。如:htm
using (DbContext dbContext = new TestDatabaseContext())
{
entityList = dbContext.Set<Catalog>().OrderBy(t=>t.CatalogID).Skip(1).Take(3).ToList();
foreach (Catalog c in entityList)
{
dbContext.Entry(c).Collection(t => t.References).Load();//顯式加載
}
return entityList;
}
參考資料:blog
http://www.cnblogs.com/nianming/p/3494781.html#2861128ip
http://www.cnblogs.com/nianming/archive/2013/01/09/2846952.htmlget