0

ParentRef 列と SortIndex 列に Unique キーを持つデータベースがあります。

LINQ で、2 つの SortIndex 値を切り替えたいと考えています。一度に複数のユーザーが存在できるように、これを 1 つのトランザクションで実行したいと考えています。LINQ を使用して値を一度に切り替えて、Unique キーに違反しないようにするにはどうすればよいですか?

        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();
        }
4

1 に答える 1

0

一意のキー値を切り替えるには、切り替え中に 3 番目の一時的な値を使用する必要があるかもしれません。

  • 新しい価値を創造する
  • 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();
    }
于 2009-09-20T09:06:36.937 に答える