尝试向数据库添加一个实体,需要更新几个表(主实体表,关系表,状态表等),如果这4个表更新中的一个失败,我需要回滚其他表。我使用的遗留代码决定使用SQLDataAdapters
,所以我决定使用这些的事务功能并大致遵循this answer(但有4个数据集而不是1个)
事务中的第一个数据集更新没有例外,但是当它达到第二个时它表示它违反了第一个不存在的密钥。当第一次更新似乎已经通过时,为什么会违反密钥?以下是我正在做的事情的粗略近似。谢谢!
public bool CreateEntity(Dataset ds1, Dataset ds2, Dataset ds3, Dataset ds4)
{
conn.Open();
var trans = conn.BeginTransaction();
dataAdapter1.UpdateCommand.Transaction = trans;
dataAdapter1.InsertCommand.Transaction = trans;
dataAdapter1.DeleteCommand.Transaction = trans;
dataAdapter2.UpdateCommand.Transaction = trans;
dataAdapter2.InsertCommand.Transaction = trans;
dataAdapter2.DeleteCommand.Transaction = trans;
dataAdapter3.UpdateCommand.Transaction = trans;
dataAdapter3.InsertCommand.Transaction = trans;
dataAdapter3.DeleteCommand.Transaction = trans;
dataAdapter4.UpdateCommand.Transaction = trans;
dataAdapter4.InsertCommand.Transaction = trans;
dataAdapter4.DeleteCommand.Transaction = trans;
try
{
dataAdapter1.Update(ds1); // Succeeds
dataAdapter2.Update(ds2); // Exception occurs here
dataAdapter3.Update(ds3);
dataAdapter4.Update(ds4);
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
conn.Close();
return false;
}
conn.Close();
return true;
}
答案 0 :(得分:0)
您需要在更新后检查ds1是否有任何插入,并获取新分配的ID' s;然后将它们放入适当的ds2元素并更新ds2。所有有点长的啰嗦。
如果您有时间使用不使用DataAdaptors的实体框架(而不是直接使用),并且EF模型会为您处理所有这些内容,那么您可以更好。