Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Свойство PrimaryKey




 

Мы рассмотрели способ конструирования структуры таблицы в объекте DataSet, а также как определять отношения между таблицами. Во всех случаях для выделения первичного ключа в таблице использовалось свойство Unique. Например, первичный ключ «Код туриста» для таблицы «Туристы» определялся так:

DataColumn dcTouristID = new DataColumn("Код туриста", typeof(int));
dcTouristID.Unique = true;

А для таблицы вариантов ответов «Variants»:

DataColumn dcID = dtVariants.Columns.Add("id", typeof(Int32));
dcID.Unique = true;
dcID.AutoIncrement = true;

Для вывода таблиц идентификации записей этого определения вполне хватает. Однако свойство Unique всего лишь указывает на уникальность заданного поля, т. е. на отсутствие повторяющихся записей.

В самом деле, в таблице может быть несколько полей, которые должны быть уникальными, и одно из них (или их комбинация) будут образовывать первичный ключ. Для указания именно первичного ключа используется свойство PrimaryKey объекта DataTable:

DataTable dtTourists = new DataTable("Туристы");
DataColumn dcTouristID = new DataColumn("Код туриста", typeof(int));
dtTourists.PrimaryKey = new DataColumn [] {dtTourists.Columns["Код туриста"]};

В сокращенной записи определение будет такое:

dtTourists.Columns.Add("Код туриста", typeof(int));
dtTourists.PrimaryKey = new DataColumn [] {dtTourists.Columns["Код туриста"]};

Можно применять комбинацию полей для задания первичного ключа:

DataTable dtTourists = new DataTable("Туристы");
DataColumn dcTouristID = new DataColumn("Код туриста", typeof(int));
DataColumn dcLastName = new DataColumn("Фамилия",typeof(string));
dtTourists.PrimaryKey = new DataColumn [] {dtTourists.Columns["Код туриста"],dtTourists.Columns["Фамилия"]};

Здесь первичным ключом будут значения поля «Код туриста» в сочетании со значением поля «Фамилия».

После определения первичного ключа объекта DataTable для свойства AllowDBNull (разрешение значений null) объектов DataColumn, формирующих ключ, будет установлено значение false.

В проектах, содержащих большое количество связанных таблиц, следует всегда определять свойство PrimaryKey. Это должно стать таким же правилом, как и задание первичного ключа при проектировании самой базы данных.

Ограничения UniqueConstraint и ForeignKeyConstraint

 

Теперь осталось разобраться, как можно определять некоторые свойства таблиц, называемые ограничениями. Свойство Constraint (ограничения) объекта DataTable бывает двух типов - UniqueConstraint и ForeignKeyConstraint.

Свойство UniqueConstraint определяет первичный ключ таблицы, например, в таблице Questions ключевым полем является questID. Объект dсQuestID представляет это поле:

DataColumn dсQuestID = dtQuestions.Columns.Add("questID", typeof(Int32));

Ограничение UniqueConstraint, налагаемое на объект dсQuestID, запрещает появление дублированных строк:

UniqueConstraint UC_dtQuestions = new UniqueConstraint(dcQuestID);
dtQuestions.Constraints.Add(UC_dtQuestions);

Однако при создании объекта dсQuestID мы ведь уже определяли его уникальность:

dсQuestID.Unique = true;

Действительно, последняя строка представляет собой неявный способ задания ограничения UniqueConstraint. Если уже определено уникальное поле или поля с помощью свойства Unique, то задавать ограничение UniqueConstraint не нужно.

Второе ограничение - ForeignKeyConstraint - определяет, как должны себя вести дочерние записи при изменении родительских записей и наоборот. ADO.NET требует точного описания объектов для управления ими, даже если изменение данных приложением не предусматривается. Ограничение ForeignKeyConstraint содержит следующие три правила:

- UpdateRule - применяется при изменении родительской строки;

- DeleteRule - применяется при удалении родительской строки;

- AcceptRejectRule - применяется при вызове метода AcceptChanges объекта DataTable, для которого определено ограничение.

Для каждого из этих правил, кроме последнего AcceptRejectRule, могут применяться следующие значения:

- Cascade - каскадное обновление связанных записей;

- None - изменения в родительской таблице не отражаются в дочерних записях;

- SetDefault - полю внешнего ключа в дочерних записях присваивается значение, заданное в свойстве DefaultValue этого поля;

- SetNull - полю внешнего ключа в дочерних записях присваивается значение Null.

Правило AcceptRejectRule принимает значения только Cascade или None. Значением по умолчанию для правил UpdateRule и DeleteRule является Cascade, для правила AcceptRejectRule - None.

Создадим ограничение для связи QuestionsVariants:

ForeignKeyConstraint FK_QuestionsVariants = new ForeignKeyConstraint(dtQuestions.Columns["questID"],
dtVariants.Columns["questID"]);
dtVariants.Constraints.Add(FK_QuestionsVariants);

Здесь задается вначале родительская колонка, а затем дочерняя (рис. 106). Добавлять созданное ограничение следует к объекту DataTable, представляющему дочернюю таблицу (в данном случае - объект dtVariants).

Рис. 106. Создание ограничения FK_QuestionsVariants

Этот фрагмент кода оставляет значения правил UpdateRule, DeleteRule и AcceptRejectRule заданными по умолчанию, т. е. Cascade и None, что соответствует значениям по умолчанию. Конструктор объекта является перегруженным.




Поделиться с друзьями:


Дата добавления: 2015-05-09; Просмотров: 575; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.