Я добавляю несколько объектов в контекст объекта.
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;
}
Если некоторые из документов проходят проверку и один не удается, все документы, которые прошли проверку, остаются добавленными в контекст объекта. Я должен очистить контекст объекта, потому что он может быть повторно использован, и может произойти следующее.
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 });
Это снова добавит документ A в контекст объекта и, следовательно, SaveChanges()
выдаст исключение из-за дублирующего первичного ключа.
Поэтому я должен удалить все уже добавленные документы в случае ошибки проверки. Я мог бы, конечно, выполнить проверку сначала и только добавить все документы после того, как они были успешно проверены, но, к сожалению, это не решает всей проблемы - если SaveChanges()
завершается сбой, все документы остаются добавленными, но несохраненными.
Я попытался отсоединить все объекты, возвращенные
this.objectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added)
но я получаю исключение, заявляя, что объект не подключен. Итак, как мне избавиться от всех добавленных, но несохраненных объектов?