Effectuez plusieurs mises à jour LINQ pour éviter une exception à clé unique
-
07-07-2019 - |
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();
}
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