Entity Framework中的DbSet

3

我在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>();

how am I able to query the table for eg:

in

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

你的问题是“如何初始化DbSet”或“EF如何将LINQ查询转换为SQL查询”? - Ilya Chumakov
3个回答

6
没有什么魔法。`TestDbContext` 派生自 `DbContext`。
`DbContext` 调用内部类 `DbSetDiscoveryService`,使用反射迭代 `DbSet` 属性并对其进行初始化。
在 EF 的 mono 版本中,您可以在 Github 上找到调用 `InitializeSets` 的代码。

4
我会说那就是魔法的定义。奇怪而未知的机制。 - Aron
1
只有当你探索内部结构时,才能了解它的未知。 - GeekzSG

4
在构建过程中,EF会扫描派生自DbContext的对象以查找任何DbSet属性,并通过反射进行初始化。
来自DbContext文档注意事项部分。

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

对于asp.net core 2.2,这发生在DbSetInitializer类中的InitializeSets()方法。 - S.Serpooshan

2
您的TestDbContext继承自DbContext。 我认为,可能是在DbContext构造函数中通过反射初始化像DbSet<Table>这样的所有字段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接