从EF实例化DbContext是否读取整个数据库?

时间:2012-01-26 22:49:23

标签: asp.net-mvc-3 entity-framework

在MVC3中实例化EntityFramework的DbContext时,整个数据库是否被读取?在调试时,可以通过查看实例化的DbContext来访问整个数据库中的所有数据,这样就不会暗示在第一次连接时抓取所有数据了吗?

3 个答案:

答案 0 :(得分:3)

绝对没有。当您访问DbContext的DbSet / ObjectSet属性时,将加载数据。

只有您查询的数据是从数据库加载并映射到对象的。例如,当您查询

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

将其翻译为SQL,在数据库中进行评估,只有与您的查询匹配的行才会返回到您的应用。

答案 1 :(得分:2)

不,实例化时不会读取整个数据库。 DbContext中的实体集合(DbSet<>)是惰性求值的。因此,当您进行调试并导航到一个时,它会被查询,而不是在实例化DbContext实例时。

答案 2 :(得分:1)

不,实体框架尝试仅在您需要信息时查询数据库,或者您需要修改信息。

以下示例是我对EF在幕后所做的个人解释。这可能有点不准确,但是出于说明的目的,这是一个重点。

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

    foreach(var entity in entities) // 3
    {
        // 4
    } // 5
} // 6
  1. 与数据库建立连接
  2. 获取一些表示“让我获得所有dem实体”的查询的对象。
  3. 枚举对象。 Aka,让上下文的查询提供程序将“get me all dem entites”翻译为(假设sql)“select * from MyEntity with(nolock);”,并运行返回ADO.NET SqlDataReader的查询,该读取将读取第一行,将对象映射到具有一些元数据的(可选)惰性对象,因此EF知道它映射到的行等,并将其作为“实体”变量。
  4. 使用您从数据库中神奇地收到的实体做一些事情而不实际做任何实际工作(感谢实体框架!)
  5. 要求EF将SqlDataReader移动到下一行并产生另一个实体(也就是说,返回步骤3,但仅当存在另一行时)
  6. 关闭与数据库的连接。