J'ajoute plusieurs entités à un contexte d'objets.
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;
}
Si certains documents passent la validation et que l'un d'eux échoue, tous les documents qui ont passé la validation restent ajoutés au contexte de l'objet. Je dois nettoyer le contexte de l'objet car il peut être réutilisé et ce qui suit peut se produire.
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 });
Cela ajoutera à nouveau le document A au contexte de l'objet et, par conséquent, le document A sera ajouté au contexte de l'objet. SaveChanges()
lancera une exception à cause d'une clé primaire dupliquée.
Je dois donc supprimer tous les documents déjà ajoutés en cas d'erreur de validation. Je pourrais bien sûr effectuer la validation en premier et n'ajouter tous les documents qu'une fois qu'ils ont été validés avec succès, mais malheureusement, cela ne résout pas le problème dans son ensemble. SaveChanges()
échoue, tous les documents restent ajoutés mais non sauvegardés.
J'ai essayé de détacher tous les objets retournés par
this.objectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added)
mais je reçois une exception indiquant que l'objet n'est pas attaché. Alors comment puis-je me débarrasser de tous les objets ajoutés mais non sauvegardés ?
8 votes
Je recommanderais de ne pas réutiliser un objectcontext. Il y a des scénarios où cela a du sens, mais ils sont très rares. Rappelez-vous que plus un ObjectContext est utilisé longtemps, plus il est gonflé, et s'il se retrouve dans un état incohérent (c'est-à-dire si quelque chose est partiellement fait), vous pouvez aussi avoir des effets secondaires incohérents.