2011-12-23 12 views
8

Otrzymuję błąd Cannot remove an entity that has not been attached. podczas próby usunięcia rekordu. Mam googled wokół i chociaż istnieje wiele miejsc, aby znaleźć rozwiązanie, aby rozwiązać ten problem, proponowana poprawka nie dostaje mi dalej:linq-sql "Nie można usunąć obiektu, który nie został dołączony"

using (MyDataContext TheDC = new MyDataContext()) 
{ 
    TheDC.MyTable.Attach(ARecord); //added this line but doesn't fix it. 
    TheDC.MyTable.DeleteOnSubmit(ARecord); 
    TheDC.SubmitChanges(); 

Moja Ważniejsze pytanie brzmi: czy to kwestia dotyczyła jedynie usunąć zapytania czy też wpływa to na inne rodzaje zapytań, a ja po prostu nie wpadłem jeszcze na ten problem. Napisałem zapytanie o aktualizację i wygląda na to, że działa bez tego błędu.

Dzięki.

Odpowiedz

11

Proszę odnieść się do tego SO post: How to delete in linq to sql?

... o dołączenie, jeśli masz już klucz podstawowy. Jeśli nie masz klucza głównego, to zawsze po prostu wykonałem pobieranie, a następnie usunięcie, ale za każdym razem, gdy robię pobranie, staram się przechowywać klucz podstawowy w celu aktualizacji i usunięcia.

Spowoduje to skasowanie klucza podstawowego, ale jeśli go posiadasz, po prostu dołącz, jak to zrobiłem poniżej i wywołaj usuwanie. Nie przepuszczam potrzebnego obiektu przez DLINQ, ponieważ chcę go zmienić, jeśli chcę, więc przechodzę do innego obiektu użytkownika i po prostu wyciągam PK z klasy biznesowej i umieszczam go w klasie DAO.

var db = new MeatRequestDataContext();    
if (input.UserID > 0) 
{ 
    entity = new User() 
    { 
     UserID = input.UserID 
    }; 
    db.Users.Attach(entity); 
    db.Users.DeleteOnSubmit(entity); 
} 
+3

+1 dla MeatRequestDataContext() – bytebender

4

Dla mnie poprawka została po prostu szukają dla obiektu bazy danych w pierwszej kolejności.

var db = new MeatRequestDataContext(); 
if (input.UserID > 0) 
{ 
    var existing = db.Users 
     .Single(user => user.UserID == input.UserID); 

    db.Users.DeleteOnSubmit(existing); 
} 

W moim umyśle, mogę tylko usunąć to, co już istnieje, więc musiałem udać się elementy w bazie danych, które chciałem, aby usunąć pierwszy. Działa to również z kolekcjami i DeleteAllOnSubmit().

Powiązane problemy