Выполните несколько обновлений LINQ, чтобы избежать исключения uniquekey - PullRequest
0 голосов
/ 17 сентября 2009

У меня есть база данных с уникальным ключом в столбцах 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();
        }

1 Ответ

0 голосов
/ 20 сентября 2009

Я думаю, что для переключения уникальных значений ключа вам может понадобиться использовать третье временное значение во время переключения, а именно:

  • создать новое значение
  • установить 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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...