Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ForeignKeyConstraint.cs
Go to the documentation of this file.
4
5namespace System.Data;
6
7[DefaultProperty("ConstraintName")]
8[Editor("Microsoft.VSDesigner.Data.Design.ForeignKeyConstraintEditor, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
10{
11 internal Rule _deleteRule = Rule.Cascade;
12
13 internal Rule _updateRule = Rule.Cascade;
14
16
18
20
21 internal string _constraintName;
22
23 internal string[] _parentColumnNames;
24
25 internal string[] _childColumnNames;
26
27 internal string _parentTableName;
28
29 internal string _parentTableNamespace;
30
32 {
33 get
34 {
36 return _childKey;
37 }
38 }
39
40 [ReadOnly(true)]
41 public virtual DataColumn[] Columns
42 {
43 get
44 {
46 return _childKey.ToArray();
47 }
48 }
49
50 [ReadOnly(true)]
51 public override DataTable? Table
52 {
53 get
54 {
56 return _childKey.Table;
57 }
58 }
59
61
63
64 [DefaultValue(AcceptRejectRule.None)]
66 {
67 get
68 {
70 return _acceptRejectRule;
71 }
72 set
73 {
74 if ((uint)value <= 1u)
75 {
77 return;
78 }
80 }
81 }
82
83 [DefaultValue(Rule.Cascade)]
84 public virtual Rule DeleteRule
85 {
86 get
87 {
89 return _deleteRule;
90 }
91 set
92 {
93 if ((uint)value <= 3u)
94 {
96 return;
97 }
98 throw ADP.InvalidRule(value);
99 }
100 }
101
102 [ReadOnly(true)]
103 public virtual DataColumn[] RelatedColumns
104 {
105 get
106 {
108 return _parentKey.ToArray();
109 }
110 }
111
113 {
114 get
115 {
118 }
119 }
120
122 {
123 get
124 {
126 return _parentKey;
127 }
128 }
129
130 [ReadOnly(true)]
131 public virtual DataTable RelatedTable
132 {
133 get
134 {
136 return _parentKey.Table;
137 }
138 }
139
140 [DefaultValue(Rule.Cascade)]
141 public virtual Rule UpdateRule
142 {
143 get
144 {
146 return _updateRule;
147 }
148 set
149 {
150 if ((uint)value <= 3u)
151 {
153 return;
154 }
155 throw ADP.InvalidRule(value);
156 }
157 }
158
159 public ForeignKeyConstraint(DataColumn parentColumn, DataColumn childColumn)
160 : this(null, parentColumn, childColumn)
161 {
162 }
163
164 public ForeignKeyConstraint(string? constraintName, DataColumn parentColumn, DataColumn childColumn)
165 {
166 DataColumn[] parentColumns = new DataColumn[1] { parentColumn };
167 DataColumn[] childColumns = new DataColumn[1] { childColumn };
168 Create(constraintName, parentColumns, childColumns);
169 }
170
171 public ForeignKeyConstraint(DataColumn[] parentColumns, DataColumn[] childColumns)
172 : this(null, parentColumns, childColumns)
173 {
174 }
175
176 public ForeignKeyConstraint(string? constraintName, DataColumn[] parentColumns, DataColumn[] childColumns)
177 {
178 Create(constraintName, parentColumns, childColumns);
179 }
180
181 [Browsable(false)]
182 public ForeignKeyConstraint(string? constraintName, string? parentTableName, string[] parentColumnNames, string[] childColumnNames, AcceptRejectRule acceptRejectRule, Rule deleteRule, Rule updateRule)
183 {
184 _constraintName = constraintName;
185 _parentColumnNames = parentColumnNames;
186 _childColumnNames = childColumnNames;
187 _parentTableName = parentTableName;
188 _acceptRejectRule = acceptRejectRule;
189 _deleteRule = deleteRule;
190 _updateRule = updateRule;
191 }
192
193 [Browsable(false)]
194 public ForeignKeyConstraint(string? constraintName, string? parentTableName, string? parentTableNamespace, string[] parentColumnNames, string[] childColumnNames, AcceptRejectRule acceptRejectRule, Rule deleteRule, Rule updateRule)
195 {
196 _constraintName = constraintName;
197 _parentColumnNames = parentColumnNames;
198 _childColumnNames = childColumnNames;
199 _parentTableName = parentTableName;
200 _parentTableNamespace = parentTableNamespace;
201 _acceptRejectRule = acceptRejectRule;
202 _deleteRule = deleteRule;
203 _updateRule = updateRule;
204 }
205
206 internal override void CheckCanAddToCollection(ConstraintCollection constraints)
207 {
208 if (Table != constraints.Table)
209 {
210 throw ExceptionBuilder.ConstraintAddFailed(constraints.Table);
211 }
213 {
215 }
216 }
217
218 internal override bool CanBeRemovedFromCollection(ConstraintCollection constraints, bool fThrowException)
219 {
220 return true;
221 }
222
223 internal bool IsKeyNull(object[] values)
224 {
225 for (int i = 0; i < values.Length; i++)
226 {
228 {
229 return false;
230 }
231 }
232 return true;
233 }
234
235 internal override bool IsConstraintViolated()
236 {
237 Index sortIndex = _childKey.GetSortIndex();
238 object[] uniqueKeyValues = sortIndex.GetUniqueKeyValues();
239 bool result = false;
240 Index sortIndex2 = _parentKey.GetSortIndex();
241 for (int i = 0; i < uniqueKeyValues.Length; i++)
242 {
243 object[] array = (object[])uniqueKeyValues[i];
244 if (!IsKeyNull(array) && !sortIndex2.IsKeyInIndex(array))
245 {
246 DataRow[] rows = sortIndex.GetRows(sortIndex.FindRecords(array));
248 for (int j = 0; j < rows.Length; j++)
249 {
250 rows[j].RowError = rowError;
251 }
252 result = true;
253 }
254 }
255 return result;
256 }
257
258 internal override bool CanEnableConstraint()
259 {
261 {
262 return true;
263 }
264 Index sortIndex = _childKey.GetSortIndex();
265 object[] uniqueKeyValues = sortIndex.GetUniqueKeyValues();
266 Index sortIndex2 = _parentKey.GetSortIndex();
267 for (int i = 0; i < uniqueKeyValues.Length; i++)
268 {
269 object[] array = (object[])uniqueKeyValues[i];
270 if (!IsKeyNull(array) && !sortIndex2.IsKeyInIndex(array))
271 {
272 return false;
273 }
274 }
275 return true;
276 }
277
278 internal void CascadeCommit(DataRow row)
279 {
280 if (row.RowState == DataRowState.Detached || _acceptRejectRule != AcceptRejectRule.Cascade)
281 {
282 return;
283 }
284 Index sortIndex = _childKey.GetSortIndex((row.RowState == DataRowState.Deleted) ? DataViewRowState.Deleted : DataViewRowState.CurrentRows);
285 object[] keyValues = row.GetKeyValues(_parentKey, (row.RowState == DataRowState.Deleted) ? DataRowVersion.Original : DataRowVersion.Default);
286 if (IsKeyNull(keyValues))
287 {
288 return;
289 }
290 Range range = sortIndex.FindRecords(keyValues);
291 if (range.IsNull)
292 {
293 return;
294 }
295 DataRow[] rows = sortIndex.GetRows(range);
296 DataRow[] array = rows;
297 foreach (DataRow dataRow in array)
298 {
299 if (DataRowState.Detached != dataRow.RowState && !dataRow._inCascade)
300 {
301 dataRow.AcceptChanges();
302 }
303 }
304 }
305
306 internal void CascadeDelete(DataRow row)
307 {
308 if (-1 == row._newRecord)
309 {
310 return;
311 }
312 object[] keyValues = row.GetKeyValues(_parentKey, DataRowVersion.Current);
313 if (IsKeyNull(keyValues))
314 {
315 return;
316 }
317 Index sortIndex = _childKey.GetSortIndex();
318 switch (DeleteRule)
319 {
320 case Rule.None:
322 {
323 Range range2 = sortIndex.FindRecords(keyValues);
324 if (!range2.IsNull && (range2.Count != 1 || sortIndex.GetRow(range2.Min) != row))
325 {
327 }
328 }
329 break;
330 case Rule.Cascade:
331 {
332 object[] keyValues2 = row.GetKeyValues(_parentKey, DataRowVersion.Default);
333 Range range4 = sortIndex.FindRecords(keyValues2);
334 if (range4.IsNull)
335 {
336 break;
337 }
338 DataRow[] rows3 = sortIndex.GetRows(range4);
339 foreach (DataRow dataRow in rows3)
340 {
341 if (!dataRow._inCascade)
342 {
343 dataRow.Table.DeleteRow(dataRow);
344 }
345 }
346 break;
347 }
348 case Rule.SetNull:
349 {
350 object[] array2 = new object[_childKey.ColumnsReference.Length];
351 for (int k = 0; k < _childKey.ColumnsReference.Length; k++)
352 {
353 array2[k] = DBNull.Value;
354 }
355 Range range3 = sortIndex.FindRecords(keyValues);
356 if (range3.IsNull)
357 {
358 break;
359 }
360 DataRow[] rows2 = sortIndex.GetRows(range3);
361 for (int l = 0; l < rows2.Length; l++)
362 {
363 if (row != rows2[l])
364 {
365 rows2[l].SetKeyValues(_childKey, array2);
366 }
367 }
368 break;
369 }
370 case Rule.SetDefault:
371 {
372 object[] array = new object[_childKey.ColumnsReference.Length];
373 for (int i = 0; i < _childKey.ColumnsReference.Length; i++)
374 {
376 }
377 Range range = sortIndex.FindRecords(keyValues);
378 if (range.IsNull)
379 {
380 break;
381 }
382 DataRow[] rows = sortIndex.GetRows(range);
383 for (int j = 0; j < rows.Length; j++)
384 {
385 if (row != rows[j])
386 {
387 rows[j].SetKeyValues(_childKey, array);
388 }
389 }
390 break;
391 }
392 }
393 }
394
395 internal void CascadeRollback(DataRow row)
396 {
397 Index sortIndex = _childKey.GetSortIndex((row.RowState == DataRowState.Deleted) ? DataViewRowState.OriginalRows : DataViewRowState.CurrentRows);
398 object[] keyValues = row.GetKeyValues(_parentKey, (row.RowState == DataRowState.Modified) ? DataRowVersion.Current : DataRowVersion.Default);
399 if (IsKeyNull(keyValues))
400 {
401 return;
402 }
403 Range range = sortIndex.FindRecords(keyValues);
404 if (_acceptRejectRule == AcceptRejectRule.Cascade)
405 {
406 if (range.IsNull)
407 {
408 return;
409 }
410 DataRow[] rows = sortIndex.GetRows(range);
411 for (int i = 0; i < rows.Length; i++)
412 {
413 if (!rows[i]._inCascade)
414 {
415 rows[i].RejectChanges();
416 }
417 }
418 }
419 else if (row.RowState != DataRowState.Deleted && row.Table.DataSet.EnforceConstraints && !range.IsNull && (range.Count != 1 || sortIndex.GetRow(range.Min) != row) && row.HasKeyChanged(_parentKey))
420 {
422 }
423 }
424
425 internal void CascadeUpdate(DataRow row)
426 {
427 if (-1 == row._newRecord)
428 {
429 return;
430 }
431 object[] keyValues = row.GetKeyValues(_parentKey, DataRowVersion.Current);
432 if (!Table.DataSet._fInReadXml && IsKeyNull(keyValues))
433 {
434 return;
435 }
436 Index sortIndex = _childKey.GetSortIndex();
437 switch (UpdateRule)
438 {
439 case Rule.None:
440 if (row.Table.DataSet.EnforceConstraints && !sortIndex.FindRecords(keyValues).IsNull)
441 {
443 }
444 break;
445 case Rule.Cascade:
446 {
447 Range range3 = sortIndex.FindRecords(keyValues);
448 if (!range3.IsNull)
449 {
450 object[] keyValues2 = row.GetKeyValues(_parentKey, DataRowVersion.Proposed);
451 DataRow[] rows3 = sortIndex.GetRows(range3);
452 for (int m = 0; m < rows3.Length; m++)
453 {
454 rows3[m].SetKeyValues(_childKey, keyValues2);
455 }
456 }
457 break;
458 }
459 case Rule.SetNull:
460 {
461 object[] array2 = new object[_childKey.ColumnsReference.Length];
462 for (int k = 0; k < _childKey.ColumnsReference.Length; k++)
463 {
464 array2[k] = DBNull.Value;
465 }
466 Range range2 = sortIndex.FindRecords(keyValues);
467 if (!range2.IsNull)
468 {
469 DataRow[] rows2 = sortIndex.GetRows(range2);
470 for (int l = 0; l < rows2.Length; l++)
471 {
472 rows2[l].SetKeyValues(_childKey, array2);
473 }
474 }
475 break;
476 }
477 case Rule.SetDefault:
478 {
479 object[] array = new object[_childKey.ColumnsReference.Length];
480 for (int i = 0; i < _childKey.ColumnsReference.Length; i++)
481 {
483 }
484 Range range = sortIndex.FindRecords(keyValues);
485 if (!range.IsNull)
486 {
487 DataRow[] rows = sortIndex.GetRows(range);
488 for (int j = 0; j < rows.Length; j++)
489 {
490 rows[j].SetKeyValues(_childKey, array);
491 }
492 }
493 break;
494 }
495 }
496 }
497
505
507 {
509 {
510 return;
511 }
513 }
514
516 {
517 if (row._inCascade)
518 {
519 return;
520 }
521 row._inCascade = true;
522 try
523 {
524 switch (action)
525 {
526 case DataRowAction.Change:
527 if (row.HasKeyChanged(_parentKey))
528 {
529 CascadeUpdate(row);
530 }
531 break;
532 case DataRowAction.Delete:
533 CascadeDelete(row);
534 break;
535 case DataRowAction.Commit:
536 CascadeCommit(row);
537 break;
538 case DataRowAction.Rollback:
539 CascadeRollback(row);
540 break;
541 default:
542 _ = 16;
543 break;
544 }
545 }
546 finally
547 {
548 row._inCascade = false;
549 }
550 }
551
552 internal override void CheckConstraint(DataRow childRow, DataRowAction action)
553 {
554 if ((action != DataRowAction.Change && action != DataRowAction.Add && action != DataRowAction.Rollback) || Table.DataSet == null || !Table.DataSet.EnforceConstraints || !childRow.HasKeyChanged(_childKey))
555 {
556 return;
557 }
558 DataRowVersion dataRowVersion = ((action == DataRowAction.Rollback) ? DataRowVersion.Original : DataRowVersion.Current);
559 object[] keyValues = childRow.GetKeyValues(_childKey);
560 if (childRow.HasVersion(dataRowVersion))
561 {
562 DataRow parentRow = DataRelation.GetParentRow(ParentKey, ChildKey, childRow, dataRowVersion);
563 if (parentRow != null && parentRow._inCascade)
564 {
565 object[] keyValues2 = parentRow.GetKeyValues(_parentKey, (action == DataRowAction.Rollback) ? dataRowVersion : DataRowVersion.Default);
566 int num = childRow.Table.NewRecord();
567 childRow.Table.SetKeyValues(_childKey, keyValues2, num);
568 if (_childKey.RecordsEqual(childRow._tempRecord, num))
569 {
570 return;
571 }
572 }
573 }
574 object[] keyValues3 = childRow.GetKeyValues(_childKey);
575 if (IsKeyNull(keyValues3))
576 {
577 return;
578 }
579 Index sortIndex = _parentKey.GetSortIndex();
580 if (sortIndex.IsKeyInIndex(keyValues3))
581 {
582 return;
583 }
584 if (_childKey.Table == _parentKey.Table && childRow._tempRecord != -1)
585 {
586 int num2 = 0;
587 for (num2 = 0; num2 < keyValues3.Length; num2++)
588 {
589 DataColumn dataColumn = _parentKey.ColumnsReference[num2];
590 object value = dataColumn.ConvertValue(keyValues3[num2]);
591 if (dataColumn.CompareValueTo(childRow._tempRecord, value) != 0)
592 {
593 break;
594 }
595 }
596 if (num2 == keyValues3.Length)
597 {
598 return;
599 }
600 }
602 }
603
628
629 internal override void CheckState()
630 {
632 }
633
634 internal override bool ContainsColumn(DataColumn column)
635 {
636 if (!_parentKey.ContainsColumn(column))
637 {
638 return _childKey.ContainsColumn(column);
639 }
640 return true;
641 }
642
644 {
645 return Clone(destination, ignorNSforTableLookup: false);
646 }
647
648 internal override Constraint Clone(DataSet destination, bool ignorNSforTableLookup)
649 {
650 int num = ((!ignorNSforTableLookup) ? destination.Tables.IndexOf(Table.TableName, Table.Namespace, chekforNull: false) : destination.Tables.IndexOf(Table.TableName));
651 if (num < 0)
652 {
653 return null;
654 }
655 DataTable dataTable = destination.Tables[num];
656 num = ((!ignorNSforTableLookup) ? destination.Tables.IndexOf(RelatedTable.TableName, RelatedTable.Namespace, chekforNull: false) : destination.Tables.IndexOf(RelatedTable.TableName));
657 if (num < 0)
658 {
659 return null;
660 }
661 DataTable dataTable2 = destination.Tables[num];
662 int num2 = Columns.Length;
663 DataColumn[] array = new DataColumn[num2];
664 DataColumn[] array2 = new DataColumn[num2];
665 for (int i = 0; i < num2; i++)
666 {
667 DataColumn dataColumn = Columns[i];
668 num = dataTable.Columns.IndexOf(dataColumn.ColumnName);
669 if (num < 0)
670 {
671 return null;
672 }
673 array[i] = dataTable.Columns[num];
674 dataColumn = RelatedColumnsReference[i];
675 num = dataTable2.Columns.IndexOf(dataColumn.ColumnName);
676 if (num < 0)
677 {
678 return null;
679 }
680 array2[i] = dataTable2.Columns[num];
681 }
682 ForeignKeyConstraint foreignKeyConstraint = new ForeignKeyConstraint(ConstraintName, array2, array);
683 foreignKeyConstraint.UpdateRule = UpdateRule;
684 foreignKeyConstraint.DeleteRule = DeleteRule;
685 foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule;
686 foreach (object key in base.ExtendedProperties.Keys)
687 {
688 foreignKeyConstraint.ExtendedProperties[key] = base.ExtendedProperties[key];
689 }
690 return foreignKeyConstraint;
691 }
692
694 {
695 int num = Columns.Length;
696 DataColumn[] array = new DataColumn[num];
697 DataColumn[] array2 = new DataColumn[num];
698 int num2 = 0;
699 for (int i = 0; i < num; i++)
700 {
701 DataColumn dataColumn = Columns[i];
702 num2 = destination.Columns.IndexOf(dataColumn.ColumnName);
703 if (num2 < 0)
704 {
705 return null;
706 }
707 array[i] = destination.Columns[num2];
708 dataColumn = RelatedColumnsReference[i];
709 num2 = destination.Columns.IndexOf(dataColumn.ColumnName);
710 if (num2 < 0)
711 {
712 return null;
713 }
714 array2[i] = destination.Columns[num2];
715 }
716 ForeignKeyConstraint foreignKeyConstraint = new ForeignKeyConstraint(ConstraintName, array2, array);
717 foreignKeyConstraint.UpdateRule = UpdateRule;
718 foreignKeyConstraint.DeleteRule = DeleteRule;
719 foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule;
720 foreach (object key in base.ExtendedProperties.Keys)
721 {
722 foreignKeyConstraint.ExtendedProperties[key] = base.ExtendedProperties[key];
723 }
724 return foreignKeyConstraint;
725 }
726
727 private void Create(string relationName, DataColumn[] parentColumns, DataColumn[] childColumns)
728 {
729 if (parentColumns.Length == 0 || childColumns.Length == 0)
730 {
732 }
733 if (parentColumns.Length != childColumns.Length)
734 {
736 }
737 for (int i = 0; i < parentColumns.Length; i++)
738 {
739 if (parentColumns[i].Computed)
740 {
741 throw ExceptionBuilder.ExpressionInConstraint(parentColumns[i]);
742 }
743 if (childColumns[i].Computed)
744 {
745 throw ExceptionBuilder.ExpressionInConstraint(childColumns[i]);
746 }
747 }
748 _parentKey = new DataKey(parentColumns, copyColumns: true);
749 _childKey = new DataKey(childColumns, copyColumns: true);
750 ConstraintName = relationName;
752 }
753
754 public override bool Equals([NotNullWhen(true)] object? key)
755 {
756 if (!(key is ForeignKeyConstraint))
757 {
758 return false;
759 }
760 ForeignKeyConstraint foreignKeyConstraint = (ForeignKeyConstraint)key;
761 if (ParentKey.ColumnsEqual(foreignKeyConstraint.ParentKey))
762 {
763 return ChildKey.ColumnsEqual(foreignKeyConstraint.ChildKey);
764 }
765 return false;
766 }
767
768 public override int GetHashCode()
769 {
770 return base.GetHashCode();
771 }
772
774 {
776 for (int i = 0; i < parentRelations.Count; i++)
777 {
778 if (parentRelations[i].ChildKeyConstraint == this)
779 {
780 return parentRelations[i];
781 }
782 }
783 return null;
784 }
785}
static readonly DBNull Value
Definition DBNull.cs:8
static ArgumentOutOfRangeException InvalidRule(Rule value)
Definition ADP.cs:139
static ArgumentOutOfRangeException InvalidAcceptRejectRule(AcceptRejectRule value)
Definition ADP.cs:104
static bool IsObjectNull(object value)
virtual ? DataSet _DataSet
Definition Constraint.cs:98
virtual string ConstraintName
Definition Constraint.cs:24
object ConvertValue(object value)
DataSetDateTime DateTimeMode
bool CompareValueTo(int record1, object value, bool checkType)
static DataRow[] GetChildRows(DataKey parentKey, DataKey childKey, DataRow parentRow, DataRowVersion version)
static DataRow GetParentRow(DataKey parentKey, DataKey childKey, DataRow childRow, DataRowVersion version)
bool HasKeyChanged(DataKey key)
Definition DataRow.cs:927
bool HasVersion(DataRowVersion version)
Definition DataRow.cs:941
object[] GetKeyValues(DataKey key)
Definition DataRow.cs:811
DataTable Table
Definition DataRow.cs:169
void SetKeyValues(DataKey key, object[] keyValues)
Definition DataRow.cs:1064
DataRowState RowState
Definition DataRow.cs:134
DataRowCollection Rows
Definition DataTable.cs:701
DataColumnCollection Columns
Definition DataTable.cs:327
DataRelationCollection ParentRelations
Definition DataTable.cs:572
void DeleteRow(DataRow row)
void SetKeyValues(DataKey key, object[] keyValues, int record)
static Exception ExpressionInConstraint(DataColumn column)
static Exception ColumnsTypeMismatch()
static Exception FailedCascadeUpdate(string constraint)
static Exception ConstraintAddFailed(DataTable table)
static Exception TablesInDifferentSets()
static Exception CaseLocaleMismatch()
static Exception FailedClearParentTable(string table, string constraint, string childTable)
static Exception KeyColumnsIdentical()
static Exception FailedCascadeDelete(string constraint)
static Exception KeyLengthMismatch()
static Exception RemoveParentRow(ForeignKeyConstraint constraint)
static Exception ForeignKeyViolation(string constraint, object[] keys)
static string KeysToString(object[] keys)
override Constraint Clone(DataSet destination, bool ignorNSforTableLookup)
override Constraint Clone(DataSet destination)
void Create(string relationName, DataColumn[] parentColumns, DataColumn[] childColumns)
ForeignKeyConstraint(string? constraintName, DataColumn[] parentColumns, DataColumn[] childColumns)
ForeignKeyConstraint(DataColumn[] parentColumns, DataColumn[] childColumns)
override bool CanBeRemovedFromCollection(ConstraintCollection constraints, bool fThrowException)
ForeignKeyConstraint Clone(DataTable destination)
ForeignKeyConstraint(string? constraintName, DataColumn parentColumn, DataColumn childColumn)
void CheckCascade(DataRow row, DataRowAction action)
ForeignKeyConstraint(DataColumn parentColumn, DataColumn childColumn)
override void CheckConstraint(DataRow childRow, DataRowAction action)
ForeignKeyConstraint(string? constraintName, string? parentTableName, string[] parentColumnNames, string[] childColumnNames, AcceptRejectRule acceptRejectRule, Rule deleteRule, Rule updateRule)
ForeignKeyConstraint(string? constraintName, string? parentTableName, string? parentTableNamespace, string[] parentColumnNames, string[] childColumnNames, AcceptRejectRule acceptRejectRule, Rule deleteRule, Rule updateRule)
override bool ContainsColumn(DataColumn column)
override void CheckCanAddToCollection(ConstraintCollection constraints)
void CheckCanClearParentTable(DataTable table)
override bool Equals([NotNullWhen(true)] object? key)
virtual AcceptRejectRule AcceptRejectRule
bool IsKeyInIndex(object key)
Definition Index.cs:713
DataRow GetRow(int i)
Definition Index.cs:606
DataRow[] GetRows(object[] values)
Definition Index.cs:611
object[] GetUniqueKeyValues()
Definition Index.cs:408
Range FindRecords(object key)
Definition Index.cs:565
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string DataConstraint_ForeignKeyViolation
Definition SR.cs:374
Definition SR.cs:7
Index GetSortIndex()
Definition DataKey.cs:184
bool RecordsEqual(int record1, int record2)
Definition DataKey.cs:195
string[] GetColumnNames()
Definition DataKey.cs:154
bool ContainsColumn(DataColumn column)
Definition DataKey.cs:117
DataColumn[] ColumnsReference
Definition DataKey.cs:7
bool ColumnsEqual(DataKey key)
Definition DataKey.cs:79
DataColumn[] ToArray()
Definition DataKey.cs:207
DataTable Table
Definition DataKey.cs:11