我正在向对象上下文中添加多个实体。
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)
但是我得到了一个异常,指出该对象没有附加。那么,如何摆脱所有已添加但未保存的对象呢?