Executar várias atualizações LINQ para evitar exceção uniquekey
-
07-07-2019 - |
Pergunta
Eu tenho um banco de dados com uma chave única nas colunas ParentRef e SortIndex.
Em LINQ, eu quero mudar dois valores SortIndex. Eu quero fazer isso em uma transação de modo que pode haver vários usuários ao mesmo tempo. Como eu, com o LINQ, mude os valores de uma só vez, por isso a minha chave única não ser violada?
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();
}
Solução
Eu acho que para mudar valores de chaves únicas, você pode precisar usar um terceiro valor temporário durante o interruptor, ou seja:
- criar novo valor
- set page2.SortIndex ao novo valor
- set page1.SortIndex para page2.SortIndex velho
- set page2.SortIndex para page1.SortIndex velho
... caso contrário é provável que atingiu uma violação de chave única durante a troca.
Algo ao longo destas linhas:
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();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow