Question

J'ai une base de données avec une clé unique dans les colonnes ParentRef et SortIndex.

Dans LINQ, je souhaite permuter deux valeurs SortIndex. Je souhaite effectuer cette opération en une seule transaction afin de pouvoir utiliser plusieurs utilisateurs à la fois. Comment, avec LINQ, permuter les valeurs d’un coup, pour que ma clé Unique ne soit pas violée?

        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();
        }
Était-ce utile?

La solution

Je pense que pour changer les valeurs de clé uniques, vous devrez peut-être utiliser une troisième valeur temporaire pendant le changement, à savoir:

  • créer une nouvelle valeur
  • définir la page2.SortIndex sur la nouvelle valeur
  • définir la page1.SortIndex à l'ancienne page2.SortIndex
  • définir la page2.SortIndex à l'ancienne page1.SortIndex

... sinon vous risquez de toucher une violation de clé unique pendant le changement.

Quelque chose dans ce sens:

    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();
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top