Работа со связями данных "многие ко многим" в платформе динамических данных

В этом разделе описано управление полями данных в таблицах, которые имеют связи "многие ко многим", в платформе динамических данных. Связи "многие ко многим" устанавливаются в основной базе данных. Типичным примером является регистрационный сайт школы, на котором в каждом классе присутствует несколько учащихся и каждый учащийся может входить в несколько классов. В общем случае связи "многие ко многим" устанавливаются с помощью таблицы объединения (которая также называется "связующей таблицей"), в которой хранятся ключи таблиц на обеих сторонах связи. В примере со школой в таблице объединения хранятся идентификаторы классов и учащихся.

В некоторых случаях связи "многие ко многим" можно представить в модели данных платформы ASP.NET. Класс LINQ to SQL не поддерживает связи "многие ко многим". В платформе ADO.Net Entity Framework связи "многие ко многим" создаются в модели данных (если в таблице объединения, представляющей связь "многие ко многим", хранятся только ключи). Такая таблица называется чистой таблицей объединения (PJT).

При создании платформой Entity Framework модели данных чистая таблица объединения не представлена непосредственно в модели данных. Вместо этого платформа Entity Framework создает между связанными таблицами связь прямой переход, которая называется «ассоциация "многие ко многим"».

Если таблица объединения содержит неключевые поля, то эта таблица не является чистой таблицей объединения, и поэтому платформа Entity Framework не сможет создать ассоциацию прямого перехода (связи "многие ко многим") между таблицами. (таблицы объединения, содержащие неключевые поля, называются также таблицами объединения с нагрузкой). Например, таблица SpecialOfferProduct базы данных AdventureWorks — это таблица объединения, но не чистая таблица объединения Entity Framework, поскольку она содержит поля rowguid и ModifiedDate. Поэтому модель EDM не может создать ассоциацию "многие ко многим", и, следовательно, платформа динамических данных не может использовать формирование шаблонов для установления непосредственной связи между таблицами SpecialOffer и Product.

Чтобы поэкспериментировать со связями "многие ко многим" в платформе динамических данных, можно использовать образец базы данных School, который можно загрузить с веб-сайта CodePlex. Образец базы данных является моделью приложения для регистрации учащихся школы. Таблица CourseInstructor образца базы данных является таблицей объединения, в которой представлены связи "многие ко многим" между таблицами Person и Course.

Проект Visual Studio с исходным кодом для данного раздела доступен на следующей странице: Dynamic Data Entity Framework.

Ниже показана диаграмма связей между таблицами Person, CourseInstructor и Course в образце базы данных School Sample в среде Microsoft SQL Sever Management Studio.

Схема связи SQL Sever Management Studio

Ниже показаны эти же связи в конструкторе ADO.NET EDM (конструктор EDM).

Схема Visual Studio для Person, CourseInstructor

Таблица CourseInstructor — это чистая таблица объединения, и поэтому платформа Entity Framework может переместить функцию join (объединение) в связанные сущности за исключением сущности CourseInstructor. Объект сущности Person может выполнять прямой переход к объекту сущности Course без использования сущности объединения. Функция join (объединение) реализована в виде свойств навигации, которые заменяют функции, реализованные в базе данных с помощью таблицы объединения. Сущности Person и Course имеют свойства навигации, описывающие путь перехода между этими двумя таблицами. Ниже показано диалоговое окно свойств конструктора EDM, которое используется для настройки ассоциации между сущностями Course и Person.

диалоговое окно свойств для ассоциации между

Платформа динамических данных может отображать сущности "многие ко многим" с прямым переходом. Если модель EDM содержит сущности "многие ко многим" с прямым переходом между ними, то платформа динамических данных использует шаблоны полей "многие ко многим" для отображения и изменения данных.

Например, предположим, что необходимо создать веб-сайт на платформе динамических данных, который использует образец базы данных School и платформу Entity Framework. В этом случае модель данных может представлять собой связь "многие ко многим", которая была описана выше.

После запуска веб-сайта отображается страница Default.aspx, содержащая список сущностей таблицы из модели данных. Можно выбрать таблицу, которая участвует в связи "многие ко многим" с прямым переходом, например таблицу Course или Person. На следующем рисунке показан фрагмент таблицы Person.

часть таблицы Person

Если выбрать сущность Person, отобразятся данные Person. Поле Course визуализируется с помощью шаблона поля ManyToMany_Edit.aspx платформы динамических данных. В поле Course отображается флажок для каждого поля таблицы Course. Ниже приведены результаты (при условии, что выбрана сущность Person для Kim Abercrombie).

визуализация страницы изменений для Kim Abercrombie

Шаблон поля ManyToMany_Edit.aspx позволяет пользователям непосредственно добавлять или удалять данные в таблице, на которую указывает ссылка. Например, можно добавить Calculus и Physics к предметам, которые преподает Kim Abercrombie и нажать кнопку обновить. После этого таблица Person отобразится снова и уже будет содержать в поле Course предметы Calculus, Chemistry и Physics для измененной сущности Person. Ниже показана визуализация страницы со списком предметов для таблицы Person. Столбец Course отображается с помощью шаблона поля ManyToMany.ascx.

страница списка для таблицы Person
Показ: