【发布时间】:2010-03-17 21:09:13
【问题描述】:
我正在向一个对象上下文添加几个实体。
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 的时间越长,它就会变得越臃肿,如果它进入不一致的状态(即部分完成的事情),您也可能会得到一些不一致的副作用。
标签: c# entity-framework