2009-02-25 9 views
8

Utworzono bazę danych .MDF w mojej aplikacji WPF.Dlaczego mój SubmitChanges() nie działa w LINQ-SQL?

Następnie wygenerowałem klasy LINQ-SQL i użyłem LINQ, aby uzyskać wszystkich klientów.

Potem biegam po nich i zmieniam ich nazwiska.

Jednak, gdy zadzwonię do SubmitChanges, , baza danych pozostaje niezmieniona.

Myślałem, że to było celem SubmitChanges(), aby przesłać zmiany do bazy danych?

Czego mi brakuje, w jaki sposób mogę "przesłać zmiany" z powrotem do mojej bazy danych?

public Window1() 
{ 
    InitializeComponent(); 

    Main2DataContext _db = new Main2DataContext(); 
    var customers = from c in _db.Customers 
        select c; 

    foreach (var customer in customers) 
    { 
     customer.LastName = "CHANGED lastname"; //ListBox shows changes 
    } 

    _db.SubmitChanges(); //does NOT save to database (???) 

} 
+2

To naprawdę głupie pytanie, ale masz klucz podstawowy na stole klienta, prawda? –

+0

Tak: ID jest kluczem podstawowym, nie dopuszcza wartości NULL, a specyfikacja tożsamości jest ustawiona na wartość IsIdentity = Tak. Stworzyłem plik .MDF z Visual Studio. –

Odpowiedz

15

Myślę, że wiem, na czym polega problem. Czy używasz lokalnego pliku .mdf? W takim przypadku sprawdź folder bin/debug. Założę się, że masz tam bazę danych ze zmianami. Myślę, że masz plik .mdf w projekcie, który jest kopiowany do folderu bin/debug przy każdym kompilacji. Dlatego zmiany są zapisywane w kopii, a nie widzisz jej w kopii, która znajduje się bezpośrednio w projekcie.

+0

Właśnie przez to przeszedłem i wydaje się to poprawne. Dołącz do kopii bin/debug MDF, a zobaczysz zmiany. –

+0

bingo, to było to! doceńcie wytrwałość każdego –

+0

Wiem tylko, że spędziłem wiele godzin ścigając to samo. Gald, mógłbym pomóc. – Micah

2

Upewnij się, że twój _b nie zostanie zresetowany do nowego kontekstu w dowolnym momencie pomiędzy pobieraniem a zmianą, jeśli tak dobrze, że to jest problem. Możesz także uprościć przypisanie źródła danych wykonując TheListBox.ItemsSource = _db.Customers;. Mam wiele miejsc w bieżącym kodzie, gdzie robię dokładnie to, co opisujesz, a zmiany są dobre. Dodatkowa sugestia, ustawienia logowania w twoim kontekście (ustaw _db.Log dla niektórych programów piszących, ogólnie używam Console.Out, dzięki czemu mogę obserwować zmiany w oknie wyjściowym podczas debugowania), dzięki czemu możesz zobaczyć zmiany, które faktycznie występują, gdy zadzwonisz pod numer SubmitChanges().

+0

Wstawiłem _db.Log = Console.Out; przed linią podziału, nie wyświetla się ona w oknie wyjściowym lub w miejscu, w którym ma się wyświetlać? –

+0

OK, maksymalnie uprościłem kod, teraz pobiera obiekty, zmienia je i zapisuje z powrotem za pomocą funkcji SubmitChanges, ale baza danych nadal ich nie zmienia. Czy masz jakieś pojęcie, dlaczego tak się dzieje? –

+0

Czy używasz trybu debugowania? Masz również opcję "Przekieruj cały tekst okna wyjściowego do natychmiastowego okna" zaznaczoną w menu Narzędzia-> Opcje-> Debugowanie-> Ogólne? Jeśli tak, twoje dane wyjściowe trafią do bezpośredniego okna, w przeciwnym razie spróbuj skonfigurować własny TextWriter wokół StringBuilder i ustawić Log. –

Powiązane problemy