Сделайте два звонка на SubmitChanges()
:
A rec_a = (from a in db.As where a.id == some_id).First();
B rec_b_old = rec_a.B;
rec_a.B = null;
rec_a.B = some_other_b;
db.SubmitChanges();
db.Bs.DeleteOnSubmit(rec_b_old);
try
{
db.SubmitChanges();
}
catch(SqlException) { } // Ignore failed delete.
Второй может потерпеть неудачу, и в этом случае просто проигнорируйте его. Можно попытаться отправить все, найти неудачное обновление / удаление, удалить его из списка ожидания и повторить попытку. Однако для этого требуется гораздо больше кода, поэтому я не думаю, что стоит делать это здесь.
Другое решение состоит в том, чтобы поместить в таблицу A триггер, который удаляет запись B, если она осиротела.