КАТЕГОРИИ: Архитектура-(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)); А для таблицы вариантов ответов «Variants»: DataColumn dcID = dtVariants.Columns.Add("id", typeof(Int32)); Для вывода таблиц идентификации записей этого определения вполне хватает. Однако свойство Unique всего лишь указывает на уникальность заданного поля, т. е. на отсутствие повторяющихся записей. В самом деле, в таблице может быть несколько полей, которые должны быть уникальными, и одно из них (или их комбинация) будут образовывать первичный ключ. Для указания именно первичного ключа используется свойство PrimaryKey объекта DataTable: DataTable dtTourists = new DataTable("Туристы"); В сокращенной записи определение будет такое: dtTourists.Columns.Add("Код туриста", typeof(int)); Можно применять комбинацию полей для задания первичного ключа: DataTable dtTourists = new DataTable("Туристы"); Здесь первичным ключом будут значения поля «Код туриста» в сочетании со значением поля «Фамилия». После определения первичного ключа объекта 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); Однако при создании объекта 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"], Здесь задается вначале родительская колонка, а затем дочерняя (рис. 106). Добавлять созданное ограничение следует к объекту DataTable, представляющему дочернюю таблицу (в данном случае - объект dtVariants). Рис. 106. Создание ограничения FK_QuestionsVariants Этот фрагмент кода оставляет значения правил UpdateRule, DeleteRule и AcceptRejectRule заданными по умолчанию, т. е. Cascade и None, что соответствует значениям по умолчанию. Конструктор объекта является перегруженным.
Дата добавления: 2015-05-09; Просмотров: 575; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |