Иллюстрированный самоучитель по Architecture .NET

Ограничения и связи

В нашем примере внешний ключ определяется таким образом, чтобы все идентификаторы авторов, содержащиеся в таблице Books (Книги), были описаны также и в таблице Authors (Авторы). Другими словами, у каждой книги, зарегистрированной в базе, есть автор, который также зарегистрирован в этой же базе. Мы назвали это ограничение '"Authors › Books". При изменении идентификатора автора правила обновления данных вынуждают объект DataSet (Набор данных) изменить этот идентификатор и во всех остальных строках таблиц на новое значение. Когда идентификатор удаляется, значение для этого идентификатора в строках, описывающих книги, будет установлено пустым.

Если при этом свойство DeleteRule имеет значение Cascade (Каскад), то каскадное удаление будет выполнено для всех таких строк из таблицы Books (Книги). Свойство АсceptRejectRule используется при транзакционном изменении объекта DataSet (Набор данных) и будет рассмотрено ниже. Значение этого свойства определяет, что произойдет при вызове метода AcceptChanges объектов DataSet (Набор данных), DataRow или DataTable (Таблица данных). В нашем примере изменения будут произведены последовательно со всеми данными. Другое возможное значение этого свойства – None (не совершать никаких действий).

// Определить FK для таблицы Books (Книги)
// (Authorld должен быть в таблице Authors (Авторы))
DataColumn *bookauthorFK [] =
new DataColumn*[1]; bookauthorFK[0] = booksauid;
ForeignKeyConstraint *fk =
new ForeignKeyConstraint(
"Authors › Books", authorsPK, bookauthorFK);
// Авторы › Книги
fk › AcceptRe;jectRule = AcceptRejectRule::Cascade;
// Каскад fk › DeleteRule = Rule::SetNull;
fk › UpdateRule = Rule:rCascade;
// Каскад books › Constraints › Add(fk);
// книги › Ограничениям › Добавить

Связи между данными

Кроме ограничений для данных, можно задавать связи между ними, для хранения которых используется коллекция DataRelation объекта DataSet (Набор данных). Связи соединяют таблицы таким образом, что вы можете перемещаться от предка к потомку и наоборот. При добавлении связи в коллекцию ограничений автоматически добавляется и соответствующий внешний ключ.

В нашем примере таблица Categories (Категории) сделана предком таблицы Book-Categories (Категории книг) через столбцы Categories (Категории) и CategoryName. Оба столбца, между которыми определяется связь, должны содержать данные одного типа. Эту связь можно использовать для нахождения строк в таблице-потомке или строки в таблице-предке по значению поля, соответствующего связанному столбцу. В нашем примере необходимо также установить связь между столбцами, описывающими номер книги в Библиотеке Конгресса в таблицах Books (Книги) и BookCategory.

// Установим связь между столбцом Categories (Категории)
// в таблице BookCategories (Категории книг) и
// столбцом Categories (Категории) в таблице Categories (Категории)
ds › Relations › Add(// Отношения › Добавить
"Category › BookCategories Relation",
// "Категория › Отношение BookCategories ",
categoryname,
en);
// Установим связь между столбцом Library of Congress Number
// (Номер книги в Библиотеке Конгресса) таблицы Books (Книги) и
// столбцом LOC таблицы BookCategories (Категории книг)
ds › Relations › Add(// Отношения › Добавить
"Book Category LOC › Book LOC Relation",
loc,
bloc);
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.