2012-01-26 78 views

回答

3

不確定不是。當您訪問DbContext的DbSet/ObjectSet屬性時,將加載數據。

只有您查詢的數據從數據庫中加載並映射到對象。例如,當你查詢像

DbContext.Table.Where(row => row.Prop1 == "Value") 

其轉換爲SQL,在數據庫,只有符合您查詢的行計算返回到您的應用程序。

2

不,整個數據庫不會在實例化中讀取。惰性評估您DbContext中的實體集合(DbSet <>)。因此,當您調試並導航到一個時,它將被查詢,而不是在DbContext實例被實例化時。

1

不,實體框架試圖只在需要信息時查詢數據庫,或者您需要修改信息。

下面的例子是我個人對我認爲EF在幕後做了什麼的解釋。這可能有些不準確,但僅供說明之用。

using(var db = new MyDbContext()) // 1 
{ 
    var entities = db.MyEntities; // 2 

    foreach(var entity in entities) // 3 
    { 
     // 4 
    } // 5 
} // 6 
  1. 建立與數據庫
  2. 連接獲取一些對象,表示查詢,說:「給我所有的數字高程模型的實體。」
  3. 枚舉該對象。也就是說,讓上下文的查詢提供程序將「讓我所有的數據實例」翻譯成(假定爲sql)「select * from MyEntity with(nolock);」,然後運行查詢返回一個ADO.NET SqlDataReader,它將讀取第一行,將對象映射到一個帶有一些元數據的(可選的)惰性對象中,這樣EF就知道它映射到哪一行了,並且將它作爲「實體」變量。
  4. 跟你從數據庫中神奇地收到沒有真正做任何實際工作(感謝實體框架!)
  5. 問EF到SqlDataReader對象移動到下一行,併產生另一個實體的實體的東西(也就是,回到步驟3,但前提是存在另一行)
  6. 關閉與數據庫的連接。