2015-05-03 18 views
5

mam to usunięcie metody:Jak mogę usunąć obiekt z DbContext w języku C#?

private void btnDeleteOrderLine_Click(object sender, EventArgs e) 
{ 
    OrderLine orderLine = (OrderLine)dgvOrderLine.SelectedRows[0].DataBoundItem; 
    db.OrderLines.Remove(orderLine); 
    db.SaveChanges(); 
    refreshGrid(); 
} 

po kliknięciu że przycisk usuwania, otrzymuję ten błąd:

The object cannot be deleted because it was not found in the ObjectStateManager .

I okazało się, że to dlatego, że były dwa przypadki Context klasie. Tak, próbowałem to:

private void btnDeleteOrderLine_Click(object sender, EventArgs e) 
{ 
    OrderLine orderLine = (OrderLine)dgvOrderLine.SelectedRows[0].DataBoundItem; 
    db.OrderLines.Attach(orderLine); // added this part 
    db.OrderLines.Remove(orderLine); 
    db.SaveChanges(); 
    refreshGrid(); 
} 

wtedy ten dał mi następujący błąd:

An entity object cannot be referenced by multiple instances of IEntityChangeTracker .

Jak mogę to naprawić i usunąć obiekt z kontekstu DbSet?

Odpowiedz

7

Musisz najpierw znaleźć element z kontekstu, a następnie wyjmij ją. Użyłem właściwości o nazwie Id. Tak nie może być. Ustawiono tam odpowiednią właściwość klucza.

var selectedOrderLine = (OrderLine)dgvOrderLine.SelectedRows[0].DataBoundItem; 

// Here using the context class we try to find if there is the 
// selected item at all 
var orderLine = db.OrderLines.SingleOrDefault(item=>item.Id == selectedOrderLine.Id); 

if(orderLine!=null) 
{ 
    // The items exists. So we remove it and calling 
    // the db.SaveChanges this will be removed from the database. 
    db.OrderLines.Remove(orderLine); 
    db.SaveChanges(); 
    refreshGrid(); 
} 

Teraz chodźmy nieco głębiej, tak rozumiemy się następujący komunikat o błędzie:

The object cannot be deleted because it was not found in the ObjectStateManager.

Jaka jest klasa ObjectStateManager? Accoding do MSDN:

ObjectStateManager tracks query results, and provides logic to merge multiple overlapping query results. It also performs in-memory change tracking when a user inserts, deletes, or modifies objects, and provides the change set for updates. This change set is used by the change processor to persist modifications.

W uzupełnieniu do powyższego:

This class is typically used by ObjectContext and not directly in applications.

+0

Upvoted, miałem zamiar pisać takie samo podejście. – Kurubaran

+0

Uwielbiam to :) Dziękuję, proszę pana! –

+0

@JohnyStark serdecznie witamy! Cieszę się, że pomogłem. – Christos

1

Spróbuj użyć usuwać zamiast zdjac i owinąć go w użyciu

using (YourContext db = new YourContext()) 
{ 
      db.OrderLines.Attach(orderLine); // added this part 
      db.OrderLines.DeleteObject(orderLine); 
      db.SaveChanges(); 
    } 
Powiązane problemy