Как работает строго типизированный DataContext? - PullRequest
4 голосов
/ 01 февраля 2010

Это подробное продолжение моего вопроса, сделанного ранее сегодня утром , о котором я до сих пор в тупике. Я использую строго типизированный DataContext для своего приложения, и хотя он выдает предупреждение, он волшебным образом работает. Как это сделать?

Вот код, который обычно используется для подключения к базе данных с использованием LINQ-to-SQL.

class MyDatabase : DataContext {
  public Table<Widget> Widgets;
  public Table<Car> Cars;

  public MyDatabase (string connection) : base(connection) { } 
}

Даже если он выдает предупреждение, он работает из коробки. С него можно начать читать с помощью:

using (var db = new MyDatabase(connectionString)) {
  foreach (var w in db.Widgets)
    Console.WriteLine(w);
}

Widgets представляется полем класса MyDatabase. И в моем коде я не назначаю это ни к чему. Но в другом месте, я читаю из этого, и у этого есть ценности. Почему?

В других примерах LINQ-to-SQL, включая код, сгенерированный инструментом макета DBML в Visual Studio 2008, класс контекста данных может выглядеть так:

public partial class MyDatabase : DataContext {
  public Table<Widget> Widgets {
    get {
      return GetTable<Widget>();
    }
  }
}

Обратите внимание на включение partial и GetTable. partial необходим?

Я предполагаю, что мой первый пример работает, в итоге вызывая GetTable, но тогда откуда этот код? Как поля моего класса контекста данных заполняются данными?

1 Ответ

3 голосов
/ 01 февраля 2010

Если они не являются свойствами, единственным логическим выводом является то, что базовый конструктор назначил их. Неожиданно, возможно, но не невозможно.

partial позволяет объединять несколько файлов кода в один класс; он нужен только в том случае, если вы разделили файл кода (обычно для дизайнеров).

Некоторое копание в рефлекторе показывает, что ctor вызывает private void InitTables(object schema), что делает точно это (отражение над полями, присваивая их через GetTable(Type)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...