2016-03-21 21 views
0

Linq hatası Row not found or changedVeritabanı Bağlamı - Yenile (RefreshMode.KeepChanges);

Veritabanı kayıtlarını demo için örnek bir uygulama var gibi görünür -

benim uygulamadan

enter image description here

, ben 'Paris' için 'Londra' dan konumu ile çalışanları güncellemek istiyorum .

var dbContext = new EmployeeDataContext(); 

var employeesInLondon = from emp in dbContext.Employees 
         where emp.Location.Equals("London") 
         select emp; 

foreach (var employeeInLondon in employeesInLondon) 
{ 
    employeeInLondon.Location = "Paris"; 
} 

//Simulate as if another user is updating the database before you submit the update 
Console.WriteLine("Now update the Employee table by running this in SQL Server Management Studio:"); 
Console.WriteLine("UPDATE Employee SET Location = 'Delhi', LastName = 'John' WHERE Location = 'London';"); 
Console.WriteLine("And hit any key..."); 
Console.ReadKey(); 

dbContext.Refresh(RefreshMode.KeepChanges); //Why the error is thrown even after adding this statement  

dbContext.SubmitChanges(); 

kod yukarıda görebileceğiniz gibi - - SSMS aracılığıyla farklı Güncelleme SQL çalıştırmak, sadece benim değişiklikleri göndermeden önce İşte benim kodudur. Ve hata beklendiği gibi atılır.

Yani, sadece SubmitChanges() çağırmadan önce kodunun altına eklendi -

dbContext.Refresh(RefreshMode.KeepChanges); 

hata yine ben SubmitChanges() çağırmadan önce veritabanı içeriğinde yenilemek bile atılan neden Sorum şu. Ben hala yukarıdaki kod ile ChangeConflictException alıyorum.

Lütfen burada ne kaçırdığımı anlatayım? Bilginize

, ben demo üzerinde oluşturmak için linki aşağıda kullanmış ve ben çelişkili nesne/üyelerini listelemek için catch blok eklemek için biliyorum - Row not found or changed - Finding the culprit

+0

varlık çerçevesi değil, bu (sizin Yeniden Etiketleme hakkında) linq-to-sql olduğunu – Jcl

cevap

2

bunu çözmek için gereken bir çatışma istisna varsa. .. Değişiklikleri tutarken yenilemenize rağmen, değişikliklerinizi gönderirken hala çözülmeyen bir çakışma var.

Değişiklikleri devam ettirdiğinizde, güncelleştirmeyi güncelleştirdiğinizde (çakışmaları olmadığında) bağlamı yenilemek yapacaktır.

Değişikliklerinizi saklamak böyle bir şey yaptığını denemek istiyorsanız

: Bu @Eldho

try 
{ 
    // the parameter tells it go ahead and update all non-conflicting items 
    // afterwards it'll throw having all conflicting items stored 
    dbContext.SubmitChanges(ConflictMode.ContinueOnConflict); 
} 
catch (ChangeConflictException ex) 
{ 
    foreach (ObjectChangeConflict o in dbContext.ChangeConflicts) 
    o.Resolve(RefreshMode.KeepChanges); // Resolve the conflicts, not just 
             // refresh the context 
    dbContext.SubmitChanges(); // and submit again 
}