以下代码有效。但是,它的工作原理是因为我最终创建了供应商的深层克隆。如果我不执行深度克隆,那么我们会收到一个错误,表明供应商对象已更改,并且修改供应商表的尝试失败。只有在运行以下行时才会发生这种情况:foreach (Supplier suppliers in exceptions)
。奇怪的是,无论是否执行Delete()
方法,都会发生这种情况。为什么会这样?我已经发布了下面的工作代码供您检查。正如我所说,如果你尝试循环而没有深度克隆,那么它不起作用......任何想法?
public void DeleteSuppliers(IList<Supplier> suppliers, Int32 parentID)
{
// If a supplier has been deleted on the form we need to delete from the database.
// Get the suppliers from the database
List<Supplier> dbSuppliers = Supplier.FindAllByParentID(parentID);
// So return any suppliers that are in the database that are not now on this form
IEnumerable<Supplier> results = dbSuppliers.Where(f => !Suppliers.Any(d => d.Id == f.Id));
IList<Supplier> exceptions = null;
// code guard
if (results != null)
{
// cast as a list
IList<Supplier> tempList = (IList<Supplier>)results.ToList();
// deep clone otherwise there would be an error
exceptions = (IList<Supplier>)ObjectHelper.DeepClone(tempList);
// explicit clean up
tempList = null;
}
// Delete the exceptions from the database
if (exceptions != null)
{
// walk the suppliers that were deleted from the form
foreach (Supplier suppliers in exceptions)
{
// delete the supplier from the database
suppliers.Delete();
}
}
}
答案 0 :(得分:1)
我认为错误是关于枚举的集合已经更改。你不允许更改foreach语句枚举的集合(或任何枚举IEnumerable的集合,如果我没记错的话)。
但是如果你制作一个克隆,那么你要枚举的集合与受删除影响的集合是分开的。
你试过浅色的副本吗?我认为这也会起作用。可以使用ToArray创建浅拷贝。
答案 1 :(得分:0)
我通过重新排序执行流来解决了这个问题。最初,这段代码是最后执行的。当我先执行它时,错误就消失了。