I have created a relation between two tables, in order for one table's rows to be protected from deletion, but this seems not to work:
My DB structure contains two tables, Areas and Locations. The Areas table has an Id column, while the Locations table has an AreaId column, serving as a foreign key.
I create a DataRelation, containing that foreign key, and now I would like to see what happens when I try to delete an Area whose Id is used as an AreaId, I though this to be straightforward:
using (var da = new SqlDataAdapter("SELECT * FROM Locations", DbConnection))
{ da.Fill(dt_Locations); }
using (var da = new SqlDataAdapter("SELECT * FROM Areas", DbConnection))
{ da.Fill(dt_Areas); }
dataSet.Tables.Add(dt_Locations);
dataSet.Tables.Add(dt_Areas);
DataRelation dr = new DataRelation("Locations_Areas",
dt_Areas.Columns["Id"],
dt_Locations.Columns["AreaId"]);
dataSet.Relations.Add(dr);
dt_Areas.Rows[0].Delete();
dataSet.AcceptChanges();
I was expecting to get some form of Exception, either from the Delete() or from the AcceptChanges() methods, but I get nothing.
For your information: the most typical error is swapping parent and child in a DataRelation. I have replaced dt_Areas.Rows[0].Delete(); by dt_Locations.Rows[0].Delete();, but that apparently was not the cause of the issue.
The whole intention is to have something like:
try
{
dt_Areas.Rows[i].Delete();
}
catch (Exception ex)
{
if <ex says that "Delete()" is not permitted because of the DataRelation>
{
statusBar.Text = "<information over ex, dt_Areas, ...>";
}
}
By the way, I also expected dataSet.AcceptChanges() to actually modify the database it's connected to, but nothing seems to have happened over there. Do I need to do something more besides AcceptChanges()?
Edit
Adding the following lines to my code solved the issue:
ForeignKeyConstraint fkC =
new ForeignKeyConstraint(dt_Areas.Columns["Id"],
dt_Locations.Columns["AreaId"]);
fkC.DeleteRule = Rule.None;
fkC.UpdateRule = Rule.None;
dt_Locations.Constraints.Add(fkC);