2015-12-23 3 views
0

Я все еще изучаю сложное программирование на C#, поэтому, пожалуйста, со мной, если есть какая-либо ошибка. Я очень стараюсь понять некоторые вещи.DbSet in 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>(); 

Как я могу ле запросить таблицу для например:

в

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

Ваш вопрос «как DbSet инициализируется» или «как EF переводит LINQ запрос SQL запроса»? –

ответ

3

Там нет магии это. TestDbContext происходит от DbContext

DbContext делает вызов на внутренний класс DbSetDiscoveryService, который использует Reflection перебрать DbSet свойств и их инициализации.

Моно версия EF, вы можете найти код на Github который показывает вызов InitializeSets

+2

Я бы сказал, что это определение магии. Странный неизвестный механизм. – Aron

+0

Это неизвестно только до тех пор, пока вы не изучите внутренности :-) –

1

Вы TestDbContext унаследовал от DbContext. Я думаю, может быть внутри конструктора DbContext через отражение все поля, такие как DbSet<Table>, инициализируются.

2

Во время строительства 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
Смежные вопросы