2013-05-04 14 views
5

Zrobiłem to wiele razy i zadziałało.Aktualizowanie rekordu przy użyciu Linq-SQL

Każdy przykład znalazłem jest dokładnie to, co mam ..

robię moje zapytanie ...

var result = from u in tdc.tblUsers 
      where u.UserID == userID 
      select u; 

a następnie zmienić wartości Chcę:

foreach (tblUsers u in result) 
{ 
    //change values (and no im not changing the primary key or foreign keys) 
} 

następnie przesyłam zmiany

tdc.SubmitChanges(); 

Próbowałem też go w ten sposób przed i dostał ten sam błąd

tblUsers result = (from u in tdc.tblUsers 
        where u.UserID == userID 
        select u).Single(); 
result.Address = address; 
result.Phone = phone; 
tdc.SubmitChanges(); 

Będzie tylko kiedykolwiek odzyskać 1 rekord z tego zapytania od UserID jest kluczem podstawowym.

Po otrzymaniu zmian, rzuca wyjątek, że wiersz nie został znaleziony lub został zmieniony. Jestem jedyną osobą używającą tego, więc nie ma żadnych innych konfliktów z dostępem do bazy danych lub blokowania. Dlaczego miałby on rzucić ChangeConflictException? Przeszedłem przez debuggera, a dane są cały czas przez cały proces, w tym zmiany, które próbuję wprowadzić.

+0

Czy korzystasz z Entity Framework (a jeśli tak, to jakiej wersji)? – gunr2171

+0

Również WSZYSTKIE twoje tabele mają klucze podstawowe. Obejmuje to ten, który edytujesz, oraz wszelkie tabele rozgałęzień z kluczy obcych. – gunr2171

+0

.NET Framework 4 i tak wszystkie tabele mają Klucze podstawowe i właściwe klucze obce. To zapytanie dotyczy tylko jednej tabeli i ta tabela nie zawiera żadnych kluczy obcych. Jest to jeden z moich podstawowych tabel. –

Odpowiedz

6

Otrzymujesz ten błąd prawdopodobnie dlatego, że jedno z twoich pól ma coś innego w projektantach Linq To SQL i rzeczywistej bazie danych.

Można też spojrzeć na ten article

powodzenia!

+0

Usunąłem dbml, odświeżone źródło danych i ponownie wyciągnąłem wszystkie moje tabele. Ponownie uruchomiono program i wyjątek nie wystąpił. Dziękuję Ci. Zapomniałem o zmianie i wprowadziłem do bazy danych wcześniej lol. +1 dla ciebie –

+0

Idę też. Powiedział mi, że muszę poczekać kilka minut lol –

2

Może pracujesz w innym kontekście? Spróbuj hermetyzować go za pomocą.

jak ten

using (myContext ctx = new myContext()) 
{ 
    var user = ctx.users.first(); 
    user.name="blah"; 
    ctx.SubmitChanges(); 
} 
0

Dość często, jeśli spojrzeć na rzeczywiste SQL że LINQ-to-SQL generuje, zobaczysz, że jest ono bardzo nadgorliwy z pasującymi wiersz bazy danych, którą początkowo odzyskane. Wyobraź sobie, że masz tabelę z identyfikatorami kolumn (PK), A, B, C. Można by pomyśleć, że jeśli zaktualizujesz kolumnę C dla wiersza, to powinno wystarczyć uaktualnienie wiersza pasującym kluczem podstawowym. Ale często zdarza się, że Linq-SQL próbuje również dopasować do kolumn A i B. Zwykle to w porządku. O ile nie masz równoczesnych zapisów, albo z wielowątkowości, albo z wielu procesów, i coś innego modyfikuje kolumnę A lub B dla rekordu, który próbujesz zaktualizować. Następnie otrzymasz te System.Data.Linq.ChangeConflictException: Row nie znaleziono lub zmieniono. błędy podczas wywoływania funkcji SubmitChanges() w kontekście danych.

Powiązane problemy