Linq to sql, клас datacontext

»» В ЦІЙ СТАТТІ ВИКОРИСТОВУЄТЬСЯ ВИХІДНИЙ КОД ДЛЯ ПРИКЛАДІВ

Клас DataContext обробляє підключення до бази даних. Він також обробляє запити, поновлення, вставки в базу даних, відстежує ідентичність, відстежує зміни, обробляє їх, забезпечує цілісність транзакцій і навіть створення бази даних. Клас DataContext транслює запити сутнісних класів в оператори SQL, які виконуються на підключеної базі даних.

Похідний від DataContext клас [Your] DataContext надає доступ до цілої групи методів бази даних, таких як ExecuteQuery, ExecuteCommand і SubmitChanges. На додаток до цих успадкованим методам клас [Your] DataContext буде містити властивості типу System.Data.Linq.Table для кожної таблиці та подання в базі даних, з якою буде використовуватись LINQ to SQL, де кожен тип T - це сутнісний клас, відображений на конкретну таблицю або уявлення.

Наприклад, поглянемо на клас Northwind, який був згенерований інструментом SQLMetal. Це - клас [Your] DataContext для бази даних Northwind. Нижче наведена найбільш примітна частина цього класу:

Як бачите, цей клас дійсно успадковується від DataContext.

Легко помітити, що в ньому оголошені п'ять конструкторів. Зверніть увагу, що конструктор за замовчуванням є приватним (private), оскільки для нього не вказано модифікатор доступу, так що створити екземпляр [Your] DataContext без параметрів не вийде. Кожен із загальнодоступних конструкторів [Your] DataContext відповідає одному з конструкторів DataContext і викликає еквівалентний конструктор класу DataContext в своєму ініціалізатор. У тілі конструкторів викликається тільки частковий метод OnCreated. Це дозволяє розробнику реалізовувати частковий метод OnCreated, який викликається при кожному створенні об'єкта [Your] DataContext.

Крім того, в класі Northwind є властивість по імені Customers типу Table, де тип Customer представляє сутнісний клас. Цей сутнісний клас Customer відображається на таблицю Customers бази даних Northwind.

Насправді не обов'язково писати код, який використовує клас [Your] DataContext. Цілком можна працювати і зі стандартним класом DataContext. Однак застосування класу [Your] DataContext робить написання решти коду зручнішим. Наприклад, якщо ви використовуєте клас [Your] DataContext, то кожна таблиця представлена ​​властивістю, яке доступне безпосередньо через об'єкт [Your] DataContext. Приклад показаний нижче:

У попередньому коді, оскільки здійснюється підключення з використанням класу [Your] DataContext по імені Northwind, є можливість звертатися до таблиці замовників Table як до властивості Customers класу [Your] DataContext. Ось результат роботи цього коду:

Linq to sql, клас datacontext

Якби замість цього підключення вироблялося із застосуванням самого класу DataContext, потрібно було б використовувати метод GetTable об'єкта DataContext як показано в прикладі нижче:

Цей код дає той же самий результат.

Так що використання класу [Your] DataContext просто зручніше, і це варто взяти на озброєння.

Клас DataContext реалізує інтерфейс IDisposable

Клас DataContext реалізує інтерфейс IDisposable і тому повинен трактуватися правильно як звільняється (disposabe) об'єкт. Це означає, що якщо створюється новий клас, що містить в собі клас DataContext або [Your] DataContext, що означає ставлення "має" (has-a) між новим класом і класом DataContext або [Your] DataContext, то новий клас також повинен реалізовувати інтерфейс IDisposable. Питання проектування класів для правильної реалізації інтерфейсу IDisposable виходять за рамки контексту цієї статті, але є безліч онлайнових ресурсів, присвячених цій темі.

Інша перевага реалізації інтерфейсу IDisposable класом DataContext полягає в тому, що тепер можна застосовувати оператор using для управління об'єктом DataContext або [Your] DataContext.

Схожі статті