Ограничения DataTable (ADO.NET)

Обновлен: November 2007

Ограничения позволяют принудительно поддерживать целостность данных DataTable. Ограничение представляет собой автоматическое правило, применяемое к столбцу или связанным столбцам и определяющее порядок действий при каком-либо изменении содержимого строки. Ограничения применяются, если свойство EnforceConstraints коллекции DataSet имеет значение true.

В ADO.NET имеется два типа ограничений: ForeignKeyConstraint и UniqueConstraint. По умолчанию оба ограничения создаются автоматически при установке связи между двумя или несколькими таблицами путем добавления отношения DataRelation к коллекции DataSet. Однако такое поведение можно отменить, указав параметр createConstraints = false при создании связи.

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

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

Свойства DeleteRule и UpdateRule ограничения ForeignKeyConstraint задают действие, которое должно быть выполнено, когда пользователь пытается удалить или обновить строку в связанной таблице. В следующей таблице приведены настройки, доступные для свойств DeleteRule и UpdateRule ограничения ForeignKeyConstraint.

Установка правил

Описание

Cascade

Удалить или обновить связанные строки.

SetNull

Присвоить столбцам в связанных строках значение DBNull.

SetDefault

Присвоить столбцам в связанных строках значение по умолчанию.

None

Не выполнять никаких действий в связанных строках. Это настройка по умолчанию.

ForeignKeyConstraint может ограничивать или распространять изменения на связанные столбцы. В зависимости от свойств, заданных для ограничения ForeignKeyConstraint столбца, при значении свойства EnforceConstraints для DataSet, равном true, определенные операции в родительских строках приведут к возникновению исключения. Например, если свойство DeleteRule ограничения ForeignKeyConstraint имеет значение None, родительскую строку нельзя удалять, если у нее имеются дочерние строки.

Можно создать ограничение внешнего ключа между отдельными столбцами или массивом столбцов с помощью конструктора ForeignKeyConstraint. Передайте объект ForeignKeyConstraint методу Add свойства таблицы Constraints, которое представляет собой объект ConstraintCollection. Для создания ограничения ForeignKeyConstraint можно также передать аргументы конструктора одному из нескольких перегруженных методов Add коллекции ConstraintCollection.

При создании ограничения ForeignKeyConstraint можно передать конструктору значения DeleteRule и UpdateRule в качестве аргументов или задать их в виде свойств, как показано в следующем примере (где значение DeleteRule равно None).

Dim custOrderFK As ForeignKeyConstraint = New ForeignKeyConstraint("CustOrderFK", _
  custDS.Tables("CustTable").Columns("CustomerID"), _
  custDS.Tables("OrdersTable").Columns("CustomerID"))
custOrderFK.DeleteRule = Rule.None  
' Cannot delete a customer value that has associated existing orders.
custDS.Tables("OrdersTable").Constraints.Add(custOrderFK)
ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",
  custDS.Tables["CustTable"].Columns["CustomerID"], 
  custDS.Tables["OrdersTable"].Columns["CustomerID"]);
custOrderFK.DeleteRule = Rule.None;  
// Cannot delete a customer value that has associated existing orders.
custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);

Свойство AcceptRejectRule

Изменения строк можно принять, используя метод AcceptChanges, или отменить с помощью метода RejectChanges для DataSet, DataTable или DataRow. Если DataSet содержит ограничение ForeignKeyConstraints, вызов методов AcceptChanges и RejectChanges применяет свойство AcceptRejectRule. Свойство AcceptRejectRule ограничения ForeignKeyConstraint определяет, какие действия следует предпринять в дочерних строках, если в родительской строке вызывается метод AcceptChanges или RejectChanges.

В следующей таблице перечислены доступные настройки AcceptRejectRule.

Установка правил

Описание

Cascade

Принять или отклонить изменения в дочерних строках.

None

Не выполнять никаких действий в дочерних строках. Это настройка по умолчанию.

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

Объект UniqueConstraint, назначаемый или отдельному столбцу, или массиву столбцов в наборе данных DataTable, обеспечивает уникальность всех данных заданного столбца или столбцов для одной строки. Можно создать ограничение уникальности для столбца или массива столбцов с помощью конструктора UniqueConstraint. Передайте объект UniqueConstraint методу Add свойства таблицы Constraints, которое представляет собой коллекцию ConstraintCollection. Для создания ограничения UniqueConstraint можно также передать аргументы конструктора одному из нескольких перегруженных методов Add коллекции ConstraintCollection. При создании ограничения UniqueConstraint для одного или нескольких столбцов можно по желанию указать, является ли этот столбец или группа столбцов первичным ключом.

Можно также создать ограничение уникальности для столбца, присвоив его свойству Unique значение true. Либо, присвоив свойству Unique одного столбца значение false, можно удалить любое существующее ограничение уникальности. При определении столбца или группы столбцов в качестве первичного ключа таблицы автоматически создается ограничение уникальности для заданного столбца или группы столбцов. Если удалить столбец из свойства PrimaryKey для DataTable, ограничение UniqueConstraint удаляется.

В следующем примере создается ограничение UniqueConstraint для двух столбцов DataTable.

Dim custTable As DataTable = custDS.Tables("Customers")
Dim custUnique As UniqueConstraint = _
    New UniqueConstraint(New DataColumn()   {custTable.Columns("CustomerID"), _
    custTable.Columns("CompanyName")})
custDS.Tables("Customers").Constraints.Add(custUnique)
DataTable custTable = custDS.Tables["Customers"];
UniqueConstraint custUnique = new UniqueConstraint(new DataColumn[] 
    {custTable.Columns["CustomerID"], 
    custTable.Columns["CompanyName"]});
custDS.Tables["Customers"].Constraints.Add(custUnique);

См. также

Ссылки

DataRelation

DataTable

ForeignKeyConstraint

UniqueConstraint

Другие ресурсы

Определение схемы DataTable (ADO.NET)

Объекты DataSet, DataTable и DataView (ADO.NET)