Выполните несколько обновлений LINQ, чтобы избежать исключения uniquekey
-
07-07-2019 - |
Вопрос
У меня есть база данных с уникальным ключом в столбцах ParentRef и SortIndex.
В LINQ я хочу переключить два значения SortIndex.Я хочу сделать это в одной транзакции, чтобы одновременно могло быть несколько пользователей.Как мне с помощью LINQ переключить значения за один раз, чтобы мой уникальный ключ не был нарушен?
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 tempSortIndex = pageToBeMoved.SortIndex;
pageToBeMoved.SortIndex = pageToBeSwitched.SortIndex;
pageToBeSwitched.SortIndex = tempSortIndex;
dc.SubmitChanges();
trans.Complete();
}
Решение
Я думаю, что для переключения уникальных значений ключа вам, возможно, потребуется использовать третье временное значение во время переключения, то есть:
- создание новой ценности
- установите 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();
}
Не связан с StackOverflow