1

我在两个表之间创建了一个关系,以便保护一个表的行不被删除,但这似乎不起作用:

我的数据库结构包含两个表,AreasLocations. 表Areas有一个Id列,而Locations表有一个AreaId列,用作外键。

我创建了一个DataRelation包含该外键的 ,现在我想看看当我尝试删除一个用作 的Area时会发生什么,尽管这很简单:IdAreaId

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);
4

0 回答 0