Я думаю, что для переключения уникальных значений ключа вам может понадобиться использовать третье временное значение во время переключения, а именно:
- создать новое значение
- установить page2.SortIndex на новое значение
- установить page1.SortIndex на старую page2.SortIndex
- установить page2.SortIndex на старую page1.SortIndex
... в противном случае вы, вероятно, нажмете нарушение уникального ключа во время переключения.
Что-то вроде этого:
var dc = new MyDataContext();
using (TransactionScope trans = new TransactionScope())
{
var pageToBeMoved = dc.Pages.Where(p => p.ID == id).Single();
var pageToBeSwitched = (from p in dc.Pages
where p.ParentRef == pageToBeMoved.ParentRef
where p.SortIndex > pageToBeMoved.SortIndex
orderby p.SortIndex ascending
select p).First();
int oldMSortIndex = pageToBeMoved.SortIndex;
int oldSSortIndex = pageToBeSwitched.SortIndex;
// note: here you need to use some value that you know will not already
// be in the table ... maybe a max + 1 or something like that
int tempSortIndex = someunusedvalue;
pageToBeMoved.SortIndex = tempSortIndex;
dc.SubmitChanges();
pageToBeSwitched.SortIndex = oldMSortIndex;
dc.SubmitChanges();
pageToBeMoved.SortIndex = oldSSortIndex;
dc.SubmitChanges();
}