Entity Framework中的幾種加載方式

        在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

相關文章
相關標籤/搜索