Estoy agregando varias entidades a un contexto de objeto.Cómo limpiar un contexto de objeto de Entity Framework?
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 algunos de los documentos pasan la validación y uno falla, todos los documentos que han pasado la validación permanecen añade al contexto objeto. Tengo que limpiar el contexto del objeto porque puede ser reutilizado y puede suceder lo siguiente.
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 });
Esto volverá a añadir el documento A al contexto objeto y, en consecuencia, SaveChanges()
será una excepción debido a una clave principal duplicado.
Así que tengo que eliminar todos los documentos ya agregados en el caso de un error de validación. Por supuesto, pude realizar primero la validación y solo agregar todos los documentos después de que se hayan validado con éxito, pero lamentablemente esto no resuelve todo el problema: si SaveChanges()
falla, todos los documentos seguirán agregados pero no guardados.
Me trataron de separar todos los objetos devueltos por
this.objectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added)
pero me estoy haciendo una excepción que indica que el objeto no está fijada. Entonces, ¿cómo me deshago de todos los objetos añadidos pero no guardados?
Yo recomendaría no reutilizar un ObjectContext. Hay escenarios en los que tiene sentido, pero son muy raros. Recuerde que cuanto más tiempo se usa un ObjectContext, más inflado se vuelve, y si se pone en un estado incoherente (es decir, algo que se hace parcialmente) también puede tener algunos efectos secundarios inconsistentes. –