为什么我需要执行深度克隆才能使此代码生效?

时间:2011-03-27 11:32:15

标签: c# deep-copy

以下代码有效。但是,它的工作原理是因为我最终创建了供应商的深层克隆。如果我不执行深度克隆,那么我们会收到一个错误,表明供应商对象已更改,并且修改供应商表的尝试失败。只有在运行以下行时才会发生这种情况: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();
           }
       }
   }

2 个答案:

答案 0 :(得分:1)

我认为错误是关于枚举的集合已经更改。你不允许更改foreach语句枚举的集合(或任何枚举IEnumerable的集合,如果我没记错的话)。

但是如果你制作一个克隆,那么你要枚举的集合与受删除影响的集合是分开的。

你试过浅色的副本吗?我认为这也会起作用。可以使用ToArray创建浅拷贝。

答案 1 :(得分:0)

我通过重新排序执行流来解决了这个问题。最初,这段代码是最后执行的。当我先执行它时,错误就消失了。