Pular para o conteúdo principal

LINQ to SQL Concurrency - ChangeConflictException Row not found or changed

ChangeConflictException Row not found or changed Se criarmos um pequeno modelo do banco de dados Northwind, e tentar modificar um dos registro de customer ("ALFKI" por exemplo):

NorthwindDataContext db = new NorthwindDataContext();

Customer alfki = db.Customers.Single(c => c.CustomerID == "ALFKI");

alfki.City = "London";

db.SubmitChanges();

Veremos que a query de atualização gerada em tempo de execução foi:

UPDATE Customers

SET City = 'London'

WHERE CustomerID = 'ALFKI' AND

CompanyName = 'Alfreds Futterkiste' AND

City = 'Berlin' AND

Region IS NULL

Evidentemente, a query de atualização da coluna cidade SET está de acordo com a coluna CustomerID, mas quem são estas condições, na cláusula where?

LINQ para SQL usa Optimistic Concurrency estratégia. Quando os registos são selecionados, não realizar qualquer lock sobre as linhas selecionadas. Só quando ele tenta atualizar os registros no banco de dados ou excluí-los é que ele verifica se os mesmos não foram alterados desde a última consulta. Como é feito? Ele tenta atualizar a linha que coincide com os valores originais, contido no DataContext. Isto explica as condições adicionais na query de atualização.

Se durante a execução a lógica foi finalizada, as atualizações que forem feitas a partir de outro programa (ou outro DataContext), lançara uma exceção:

System.Data.Linq.ChangeConflictException was unhandled
Message="Row not found or changed."
Source="System.Data.Linq"

LINQ para SQL tenta olhar para o registro atualizado e comparar com todas as colunas com seus valores originais, e quando não encontra o registro, a exceção é lançada. Essa é a maneira que o LINQ para SQL nos diz que a linha que estava procurando foi eliminada ou alterada por outro programa e a atualização não pode ser feita.

Artigo original
Guy Burstein's

Comentários

Postagens mais visitadas deste blog

A batalha por uma SafeKid (Unicamp)

Figura 1 - Cadeira Safekid (Unicamp) Nas consultas usando a ferramenta de busca do Google obtive os seguintes link para a tal cadeira. 1- http://revistacrescer.globo.com/Crescer/0,19125,EFC1010380-2213-2,00.html 2- http://www.ibiubi.com.br/produtos/cadeira-cinto-de-seguran%c3%a7a-safekid-projetado-pela-unicamp+beb%c3%aas-e-crian%c3%a7as+cadeiras/IUID4138740/ 3- http://compras.hsw.uol.com.br/assento-infantil-guia.htm 4- http://produto.mercadolivre.com.br/MLB-123086053-cadeiracinto-de-seguranca-safekid-projetado-pela-unicamp-_JM a própria! só que venda finalizada. Foi então que resolvi procurar no Bing (Microsoft) www.bing.com. Também não encontrei! Rs Encontrei algumas parecidas a preços imbatíveis, mas fora do país. 1- http://www.magazineluiza.com.br/produto/index_Produto.asp?Produto=1766074&linha=BB&Setor=CADA&modelo=08 2- http://www.precomania.com/search_attrib.php/page_id=1990/st=page/page=1 Mas foi no Yahoo buscas que eu encontrei a dita cuja. Quero dizer, um possível ...

Driver para Receptor de TV Digital da Multilaser RE003

Email recebido da central de atendimento da Multilaser para resolver problema de funcionamento do receptor digital em Windows 7. --------------------------------------------------------------------------------- Prezado(a) Cliente, Primeiramente pedimos desculpas por quaisquer transtornos causados. Segue anexo manual passo a passo para a instalação do RE003. Conseguimos desenvolver um novo software para o aparelho, pois o enviado no cd não estava conseguindo localizar canais. Peço a gentileza de seguir o passo a passo e me informar se conseguiu utilizar o produto. Os drivers que irá precisar estão disponíveis no link http://tinyurl.com/j3w3svn Os drivers que irá precisar estão disponíveis no link  http://tinyurl.com/j3w3svn Os drivers que irá precisar estão disponíveis no link  http://tinyurl.com/j3w3svn Instale os drivers e o software Presto! Serial: EVALUATION

EmguCV DLL Not Found Exception -Unable to find cvextern?

Eu também tive os mesmos problemas. Neste fórum emgucv , não sei por que cvextern.dlldo emgucv 3.4.3 não é possível carregar cvextern (porque não é possível encontrar cvextern), e você permitiu usar o arquivo cvextern.dlldo emgucv 3.4.2 (certifique-se de escolher x64 / x86), copie /bin/Debuge este arquivo é encontrado automaticamente /bin/Debug/x86ou /bin/Debug/x64quando você termina de construir o programa no Visual Studio.  O Erro:  The type initializer for 'Emgu.CV.CvInvoke' threw an exception. : Unable to load DLL 'cvextern': The specified module could not be found. (Exception from HRESULT: 0x8007007E)  Para resolver o problema copia a pasta x64 ou x86 para dentro da pasta bin da aplicação. Ou copie os arquivos para dentro da pasta bin da aplicação WCF.