Ahogy az ezt megelőző cikkünkből kiderült, az adattáblák oszlopaira létrehozott megszorításokat (objektumokat) az adott tábla Constraints kollekciójába kell felvennünk ahhoz, hogy ezek a megszorítások érvényre jussanak.
Idegen kulcs megszorítást a ForeignKeyConstraint osztály példányosításával hozhatunk létre, melyet szintén fel kell vennünk az adott tábla megszorítás gyűjteményébe. Az osztály property-jeit feltöltve jelölhetjük ki a megszorításban érintett oszlopokat, valamint adhatjuk meg az egyes rekordok törlésére, illetve frissítésére vonatkozó információkat. Lássunk most ezen property-ket:

AcceptRejectRule
Osztály: ForeignKeyConstraint
public virtual AcceptRejectRule AcceptRejectRule {get; set;}
Lehetséges értékei az AcceptRejectRule enumerátor valamely eleme, melyekkel beállítható, hogy milyen akció történjen akkor, amikor a táblára meghívódik az AcceptChanges, vagy a RejectChanges metódusok valamelyike. Értékei:
| Érték |
Magyarázat |
| Cascade |
A főtábla oszlopának értékeiben bekövetkezett valamennyi változás érvényesül a gyermektábla oszlopának értékein (idegen kulcs oszlopok). |
| None |
Nem történik semmilyen változás. |

Columns
Osztály: ForeignKeyConstraint
public virtual DataColumn[] Columns {get;}
Lekérdezhetők azok a gyermektábla oszlopok, mely valamely főtáblabeli oszlophoz tartoznak, vagyis idegen kulcs oszlopok.

ConstraintName
Osztály: ForeignKeyConstraint
public virtual string ConstraintName {get; set;}
Megadhatunk egy nevet a megszorítás számára, mellyel a DataTable objektum Constraints gyűjteményében hivatkozhatunk az adott megszorításra.

DeleteRule
Osztály: ForeignKeyConstraint
public virtual Rule DeleteRule {get; set;}
Megadható egy szabály annak meghatározására, hogy mi történjen abban az esetben, mikor egy rekordot törlünk a főtáblából, mely bizonyos oszlopaival kötődik a gyermektáblához. Lehetséges értékei a Rule enumerátor elemei:
| Érték |
Magyarázat |
| Cascade |
A gyermektábla oszlopaira hivatkozó oszlopot tartalmazó rekord törlése a főtáblából az érintett összes rekord törlését eredményezi a gyermektáblában. Az adott property-nek ez az alapértelmezett beállítása. |
| SetNull |
A gyermektábla érintett oszlopának valamennyi hivatkozott értékét egy DBNull értékkel helyettesíti. Ez általában a ’(null)’ bejegyzés, de ennek megjelenése függ attól, hogy az adott oszlopra deklaráltunk-e UNIQUE megszorítást, mert ebben az esetben a DBNull értékek sem ismétlődhetnek. |
| SetDefault |
Ebben az esetben az adott oszlop érintett rekordértékeit az adott oszlopra megadott DefaultValue (alapértelmezett érték) értékkel helyettesíti. |
| None |
Nem történik semmilyen változás a gyermektáblában. Ebben az esetben egy InvalidConstraintException kivétel dobódik, amikor megpróbálunk rekordot törölni a főtáblából. |

RelatedColumns
Osztály: ForeignKeyConstraint
public virtual DataColumn[] RelatedColumns {get;}
Lekérdezhetők azok az oszlopok, melyek a főtáblában találhatóak, és érintettek a megszorításban.

RelatedTable
Osztály: ForeignKeyConstraint
public virtual DataTable RelatedTable {get;}
Lekérdezhető a szülőtábla, melynek oszlopai megtalálhatóak a gyermektáblában.

Table
Osztály: ForeignKeyConstraint
public override DataTable Table {get;}
Megadja az adott megszorítás gyermektábláját.

UpdateRule
Osztály: ForeignKeyConstraint
public virtual Rule UpdateRule {get; set;}
Megadható egy szabály annak meghatározására, hogy mi történjen abban az esetben, mikor egy rekord érintett oszlopának értékét megváltoztatjuk a főtáblában, mely oszlop megtalálható a gyermektáblában. Lehetséges értékei szintén a Rule felsorolt típus elemei, csakúgy mint a DeleteRule property esetében.
Az osztály konstruktorainak néhány változata közül a következő rendelkezik a leghosszabb paraméterlistával, így itt adhatjuk meg a legtöbb információt:

ForeignKeyConstraint
Osztály: ForeignKeyConstraint
public ForeignKeyConstraint(
string constraintName,
string parentTableName,
string[] parentColumnNames,
string[] childColumnNames,
AcceptRejectRule acceptRejectRule,
Rule deleteRule,
Rule updateRule
);
Létrehoz egy megszorítás osztály példányt.
Paraméterek
string constraintName
Megszorítás neve.
string parentTableName
Főtábla neve.
string[] parentColumnNames
Főtábla oszlopai.
string[] childColumnNames
Gyermektábla oszlopai.
AcceptRejectRule acceptRejectRule
Alkalmazott szabály AcceptChanges, illetve RejectChanges metódusok hívása esetén.
Rule deleteRule
Alkalmazott szabály rekordok törlésekor.
Rule updateRule
Alkalmazott szabály rekordok oszlopértékeinek frissítésekor.
A mellékelt példában programból feltöltünk két adattáblát, a gyermektáblában deklarálunk egy idegen kulcs megszorítást, és modellezzük, mi történik akkor, amikor a ComboBox kontrolban megadott azonosítóval rendelkező rekordon a kiválasztott szabály alapján elvégezzük a törlési műveletet. A tábla objektumokat elhelyezzük egy DataSet objektumban.
A felső (Products) tábla PRODUCT_ID oszlopa megtalálható az alsó (Orders) táblában idegen kulcsként, melynek megadásáról a következőképpen gondoskodunk a feltöltéskor:
ForeignKeyConstraint fkc = new ForeignKeyConstraint("fk",ds.Tables[0].Columns[0],ds.Tables[1].Columns[1]);
És a megszorítás objektumot betesszük a táblaobjektum gyűjteményébe:
ds.Tables[1].Constraints.Add(fkc);
A megadott azonosítóval rendelkező rekord törlésekor megvizsgáljuk, hogy mely értéket adtuk meg a ComboBox kontrolban, majd ennek megfelelően állítjuk be a DeleteRule property-t:
((ForeignKeyConstraint)ds.Tables[1].Constraints[0]).DeleteRule = Rule.Cascade;
...
((ForeignKeyConstraint)ds.Tables[1].Constraints[0]).DeleteRule = Rule.SetNull;
...
((ForeignKeyConstraint)ds.Tables[1].Constraints[0]).DeleteRule = Rule.None;
A SetDefault értéket nem teszteljük, mert nem adtunk meg alapértelmezett értéket a PRODUCT_ID oszlopra. A beállítás után elvégezzük a törlést:
ds.Tables[0].Rows.RemoveAt(idCombo.SelectedIndex);
A Rule.SetNull értéket megadva, pedig elkapjuk az InvalidConstraintException kivételt. A táblák teljes tartalmának törlésekor a helyreállítás a megjelenő gombbal megtehető.