我将几个实体添加到对象上下文中。如何清理实体框架对象上下文?
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)
脱离返回的所有对象,但我得到一个例外,说明该对象未连接。那么如何摆脱所有添加但未保存的对象?
我建议不重用ObjectContext的。有些情况下,它是有道理的,但它们非常罕见。请记住,使用ObjectContext的时间越长,它就越容易获得,如果它进入不一致的状态(即部分完成),则可能会产生一些不一致的副作用。 – 2010-03-18 05:56:56