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