C#. Relations beetwen tables in DataSet

Metanit

DataSet может содержать множество таблиц, которые могут быть связаны различными отношениями. Например, пусть у нас в dataset будет определена таблица производителей смартфонов и таблица самих смартфонов, которая связана с первой:

Ключевым моментом здесь является установка отношения между таблицами:

Первым параметром здесь идет название отношения, по которому потом на него можно будет ссылаться. Вторым параметром идет главный столбец – id компании в таблице компаний. Третий параметр – подчиненный столбец – id компании в таблице смартфонов. Подчиненный столбец зависит от главного. Вместо этих параметров мы можем передать объект DataRelation, который также будет иметь данные значения.

Затем используя отношение, мы можем получить для одной строки из таблицы компаний связанные строки из таблицы смартфонов:

Внешние ключи

Кроме простого отношения между таблицами мы также можем задать внешние ключи, как в обычных базах данных. Для этого непосредственно перед строкой:

Добавим следующий код:

Внешний ключ представляет объект ForeignKeyConstraint, в конструктор которого передается два параметра: главный столбец и зависимый столбец. В данном случае это те же самые столбцы.

Также у него мы можем установить ряд свойств. Через свойство ConstraintName устанавливается название внешнего ключа. Свойства DeleteRule и UpdateRule определют поведение при удалении или обновлении данных соответственно в главной таблице (то есть в данном случае в таблице компаний). Эти свойства принимают одно из значений перечисления Rule:

  • Cascade: происходит автоматическое изменение или удаление строк в подчиненной таблице
  • None: строки в подчиненной таблице не изменяются
  • SetDefault: происходит установка значений по умолчанию для связанных строк (которое определяется через DataColumn.DefaultValue)
  • SetNull: для связанных строк устанавливается значение DBNull

С помощью метода ds.Tables["Phones"].Constraints.Add(foreignKey); внешний ключ добавляется к таблице смартфонов. И затем через выражение ds.EnforceConstraints = true; происходит применение внешнего ключа.

И если мы удалим, например, одну из строк из таблицы компаний, то в таблице смартфонов все строки, которые связаны с удаленной, в столбце CompanyId будут иметь значение null.

This entry was posted in C#. Bookmark the permalink.