當在MVC3中實例化EntityFramework的DbContext時,整個數據庫是否被讀取?調試時,通過查看實例化的DbContext可以訪問整個數據庫中的所有數據,這是否意味着在第一次連接時所有數據都被抓取?是否從EF實例化DbContext讀取整個數據庫?
1
A
回答
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
- 建立與數據庫
- 連接獲取一些對象,表示查詢,說:「給我所有的數字高程模型的實體。」
- 枚舉該對象。也就是說,讓上下文的查詢提供程序將「讓我所有的數據實例」翻譯成(假定爲sql)「select * from MyEntity with(nolock);」,然後運行查詢返回一個ADO.NET SqlDataReader,它將讀取第一行,將對象映射到一個帶有一些元數據的(可選的)惰性對象中,這樣EF就知道它映射到哪一行了,並且將它作爲「實體」變量。
- 跟你從數據庫中神奇地收到沒有真正做任何實際工作(感謝實體框架!)
- 問EF到SqlDataReader對象移動到下一行,併產生另一個實體的實體的東西(也就是,回到步驟3,但前提是存在另一行)
- 關閉與數據庫的連接。