J'ajoute plusieurs entités à un contexte d'objet. Si certains documents réussissent la validation et qu'un échec échoue, tous les documents ayant 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 arriver.Comment nettoyer un contexte d'objet Entity Framework?
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 });
Ce sera de nouveau ajouter le document A au contexte de l'objet et par conséquent SaveChanges()
va lancer une exception en raison d'une clé primaire en double.
Je dois donc supprimer tous les documents déjà ajoutés dans le cas d'une erreur de validation. Je pourrais bien sûr effectuer la validation en premier et ajouter seulement tous les documents après qu'ils aient été validés avec succès, mais malheureusement cela ne résout pas tout le problème - si SaveChanges()
échoue, tous les documents restent encore 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 sauvés?
Je ne recommanderais pas réutiliser un ObjectContext. Il y a des scénarios où cela a du sens, mais ils sont très rares. Souvenez-vous que plus un objet ObjectContext est utilisé, plus il est gonflé, et s'il entre dans un état incohérent (c'est-à-dire que quelque chose est partiellement fait), vous risquez également d'avoir des effets secondaires incohérents. –