实体框架中的DbSet

时间:2015-12-23 06:26:05

标签: c# .net entity-framework

我在Entity Framework中有以下代码:

using(var dbc = new TestDbContext())
{
    var data = (from a in dbc.tableList
                select new { a = id }).ToList();
}

当我调试代码时,我遇到了以下代码

public class TestDbContext : DbContext
{
     public TestDbContext()
     { 
     }

     public DbSet<Table> tableList {get;set;}
}

我想知道甚至没有像这样创建DbSet<Table>的实例:

public Dbset<Table> tableList = new Dbset<Table>();

我如何查询表格,例如:

in

var data = (from a in dbc.tableList
            select new { a = id }).ToList();

3 个答案:

答案 0 :(得分:4)

这对此毫无魔力。 TestDbContext源自DbContext

DbContext调用内部类DbSetDiscoveryService,它使用Reflection迭代DbSet属性并初始化它们。

EF的单声道版本,您可以在Github上找到显示InitializeSets

呼叫的代码

答案 1 :(得分:3)

在构建过程中,EF将扫描DbContext派生对象中的任何DbSet属性,并通过反射对其进行相应的初始化。

来自DbContext documentation上的备注部分。

  

DbContext通常与派生类型一起使用,该派生类型包含模型的根实体的DbSet<TEntity>属性。创建派生类的实例时,将自动初始化这些集。可以通过将SuppressDbSetInitializationAttribute属性应用于整个派生的上下文类或类的各个属性来修改此行为。

如果您想知道它是如何工作的,您可以在这里看到来源:

  1. http://entityframework.codeplex.com/SourceControl/latest#src/EntityFramework/DbContext.cs
  2. http://entityframework.codeplex.com/SourceControl/latest#src/EntityFramework/Internal/DbSetDiscoveryService.cs

答案 2 :(得分:1)

您继承自DbContext的TestDbContext。 我想,可能在DbContext构造函数中通过反射所有字段如DbSet<Table>都被初始化。