»» В ЦІЙ СТАТТІ ВИКОРИСТОВУЄТЬСЯ ВИХІДНИЙ КОД ДЛЯ ПРИКЛАДІВ
Клас DataContext обробляє підключення до бази даних. Він також обробляє запити, поновлення, вставки в базу даних, відстежує ідентичність, відстежує зміни, обробляє їх, забезпечує цілісність транзакцій і навіть створення бази даних. Клас DataContext транслює запити сутнісних класів в оператори SQL, які виконуються на підключеної базі даних.
Похідний від DataContext клас [Your] DataContext надає доступ до цілої групи методів бази даних, таких як ExecuteQuery, ExecuteCommand і SubmitChanges. На додаток до цих успадкованим методам клас [Your] DataContext буде містити властивості типу System.Data.Linq.Table
Наприклад, поглянемо на клас Northwind, який був згенерований інструментом SQLMetal. Це - клас [Your] DataContext для бази даних Northwind. Нижче наведена найбільш примітна частина цього класу:
Як бачите, цей клас дійсно успадковується від DataContext.
Легко помітити, що в ньому оголошені п'ять конструкторів. Зверніть увагу, що конструктор за замовчуванням є приватним (private), оскільки для нього не вказано модифікатор доступу, так що створити екземпляр [Your] DataContext без параметрів не вийде. Кожен із загальнодоступних конструкторів [Your] DataContext відповідає одному з конструкторів DataContext і викликає еквівалентний конструктор класу DataContext в своєму ініціалізатор. У тілі конструкторів викликається тільки частковий метод OnCreated. Це дозволяє розробнику реалізовувати частковий метод OnCreated, який викликається при кожному створенні об'єкта [Your] DataContext.
Крім того, в класі Northwind є властивість по імені Customers типу Table
Насправді не обов'язково писати код, який використовує клас [Your] DataContext. Цілком можна працювати і зі стандартним класом DataContext. Однак застосування класу [Your] DataContext робить написання решти коду зручнішим. Наприклад, якщо ви використовуєте клас [Your] DataContext, то кожна таблиця представлена властивістю, яке доступне безпосередньо через об'єкт [Your] DataContext. Приклад показаний нижче:
У попередньому коді, оскільки здійснюється підключення з використанням класу [Your] DataContext по імені Northwind, є можливість звертатися до таблиці замовників Table
Якби замість цього підключення вироблялося із застосуванням самого класу DataContext, потрібно було б використовувати метод GetTable
Цей код дає той же самий результат.
Так що використання класу [Your] DataContext просто зручніше, і це варто взяти на озброєння.
Клас DataContext реалізує інтерфейс IDisposable
Клас DataContext реалізує інтерфейс IDisposable і тому повинен трактуватися правильно як звільняється (disposabe) об'єкт. Це означає, що якщо створюється новий клас, що містить в собі клас DataContext або [Your] DataContext, що означає ставлення "має" (has-a) між новим класом і класом DataContext або [Your] DataContext, то новий клас також повинен реалізовувати інтерфейс IDisposable. Питання проектування класів для правильної реалізації інтерфейсу IDisposable виходять за рамки контексту цієї статті, але є безліч онлайнових ресурсів, присвячених цій темі.
Інша перевага реалізації інтерфейсу IDisposable класом DataContext полягає в тому, що тепер можна застосовувати оператор using для управління об'єктом DataContext або [Your] DataContext.