Пока сделал так
var dtup = dataSet.pePrograms.GetChanges();
if (dtup != null)
{
var chRows = new Hashtable();
// Сохраняем старые ID
foreach (DataRow row in dtup.Rows)
chRows.Add(row.GetHashCode(), row["Program_id"]);
peProgramsTableAdapter.Update((DataSet.peProgramsDataTable)dtup);
dataSet.AcceptChanges();
/* Обновляем Parrent_id изменившихся ID */
dtup.AcceptChanges();
foreach (DataRow row in dtup.Rows)
{
var oldId = (int)chRows[row.GetHashCode()];
foreach (DataRow chRow in dtup.Rows)
if (chRow["Parrent_id"].Equals(oldId))
chRow["Parrent_id"] = row["Program_id"];
}
var reldtup = dtup.GetChanges();
if (reldtup != null) peProgramsTableAdapter.Update((DataSet.peProgramsDataTable)reldtup);
dtup.AcceptChanges();
peProgramsTableAdapter.Fill(dataSet.pePrograms);
}
Работает ... но как то не нравится