Ich füge mehrere Entitäten zu einem Objektkontext hinzu.So bereinigen Sie einen Entity Framework-Objektkontext?
try
{
forach (var document in documents)
{
this.Validate(document); // May throw a ValidationException.
this.objectContext.AddToDocuments(document);
}
this.objectContext.SaveChanges();
}
catch
{
// How to clean-up the object context here?
throw;
}
Wenn einige der Dokumente, die die Validierung vergehen und man ausfällt, werden alle Dokumente, die die Validierung bestanden bleiben dem Objektkontext hinzugefügt. Ich muss den Objektkontext aufräumen, da er wiederverwendet werden kann und Folgendes passieren kann.
var documentA = new Document { Id = 1, Data = "ValidData" };
var documentB = new Document { Id = 2, Data = "InvalidData" };
var documentC = new Document { Id = 3, Data = "ValidData" };
try
{
// Adding document B will cause a ValidationException but only
// after document A is added to the object context.
this.DocumentStore.AddDocuments(new[] { documentA, documentB, documentC });
}
catch (ValidationException)
{
}
// Try again without the invalid document B. This causes an exception because
// of a duplicate primary key - document A with id 1 is added a second time.
this.DocumentStore.AddDocuments(new[] { documentA, documentC });
Dies wird wieder Dokument A zum Objekt Kontext hinzufügen und in Folge SaveChanges()
eine Ausnahme wegen eines doppelten Primärschlüssel werfen.
Also muss ich im Falle eines Validierungsfehlers alle bereits hinzugefügten Dokumente entfernen. Ich könnte natürlich zuerst die Validierung durchführen und nur alle Dokumente hinzufügen, nachdem sie erfolgreich validiert wurden, aber das löst leider nicht das ganze Problem - wenn SaveChanges()
fehlschlägt, bleiben alle Dokumente hinzugefügt, aber nicht gespeichert.
Ich habe versucht, alle Objekte, die von
this.objectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added)
aber ich bin immer eine Ausnahme besagt, dass das Objekt ist nicht zurückgegeben zu lösen. Wie kann ich alle hinzugefügten, aber nicht gespeicherten Objekte entfernen?
würde ich empfehlen, eine Object nicht wiederverwenden. Es gibt Szenarien, in denen es Sinn macht, aber sie sind sehr selten. Denken Sie daran, je länger ein ObjectContext verwendet wird, desto aufgeblähter wird es, und wenn es in einen inkonsistenten Zustand gerät (d. H. Etwas wird teilweise erledigt), können Sie auch einige inkonsistente Nebenwirkungen bekommen. –