我在两个表之间创建了一个关系,以便保护一个表的行不被删除,但这似乎不起作用:
我的数据库结构包含两个表,Areas
和Locations
. 表Areas
有一个Id
列,而Locations
表有一个AreaId
列,用作外键。
我创建了一个DataRelation
包含该外键的 ,现在我想看看当我尝试删除一个用作 的Area
时会发生什么,尽管这很简单:Id
AreaId
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();
我期望从方法或方法中获得某种形式的Exception
,但我什么也没得到。Delete()
AcceptChanges()
供您参考:最典型的错误是在 DataRelation 中交换父级和子级。我已替换dt_Areas.Rows[0].Delete();
为dt_Locations.Rows[0].Delete();
,但这显然不是问题的原因。
整个意图是有类似的东西:
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, ...>";
}
}
顺便说一句,我还希望dataSet.AcceptChanges()
实际修改它所连接的数据库,但那里似乎没有发生任何事情。除此之外,我还需要做更多的事情AcceptChanges()
吗?
编辑
将以下行添加到我的代码中解决了这个问题:
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);