Свойство PrimaryKey
Мы научились конструировать структуру таблицы в объекте DataSet, а также определять отношения между таблицами. Во всех случаях для выделения первичного ключа в таблице использовалось свойство Unique. Например, в самом последнем примере - проекте Programm2DataGrid2Table - первичный ключ "Код туриста" определялся так:
... DataColumn dcTouristID = new DataColumn("Код туриста", typeof(int)); dcTouristID.Unique = true; ...
DataColumn dcInfoTouristsID = new DataColumn("Код туриста", typeof(int)); dcInfoTouristsID.Unique = 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 в редакторе Tables Collection Editor после создания объектов Columns в свойстве PrimaryKey можно выделять одно или несколько полей - они отмечаются числами и становятся первичным ключом (рис. 9.15):
Рис. 9.15. Определение первичного ключа в редакторе Tables Collection Editor
После определения первичного ключа объекта DataTable для свойства AllowDBNull (разрешение значений null) объектов DataColumn, формирующих ключ, будет установлено значение false.
В проектах, содержащих большое количество связанных таблиц, следует всегда определять свойство PrimaryKey. Это должно стать таким же правилом, как и задание первичного ключа при проектировании самой базы данных.