收集被修改;即使我创建了当前对象的副本,枚举操作也可能无法执行

时间:2013-08-19 13:10:01

标签: linq entity-framework

我有以下存储库方法: -

public void DeleteVM(int id, string username)
        {
            var VM = tms.TMSVirtualMachines.SingleOrDefault(a => a.TMSVirtualMachineID == id);
            var auditinfo = IntiateTechnologyAudit(tms.AuditActions.SingleOrDefault(a => a.Name.ToUpper() == "DELETE").ID,
                    VM.Technology.TechnologyType.AssetTypeID,
                 username, VM.TMSVirtualMachineID);
            var technology = tms.Technologies.SingleOrDefault(a => a.TechnologyID == id);
            technology.IsDeleted = true;
            tms.Entry(technology).State = EntityState.Modified;
            var vm2 = VM;
            foreach(var ip in vm2.Technology.TechnologyIPs)
            {
            tms.TechnologyIPs.Remove(ip);

            }
            tms.TMSVirtualMachines.Remove(VM);
                      InsertOrUpdateTechnologyAudit(auditinfo);
        }

但我得到以下例外: -

  

发现System.InvalidOperationException HResult = -2146233079
  消息=集合已修改;枚举操作可能不会   执行。 Source = System.Core StackTrace:          在System.Collections.Generic.HashSet`1.Enumerator.MoveNext()

虽然我已经创建了VM的副本,但是我对它进行了预测..

1 个答案:

答案 0 :(得分:1)

您需要执行浅拷贝,而不是参考副本。即使你复制它,你也只复制引用,所以你要枚举的是与你要删除的东西相同的HashSet。 你需要做的是构造另一个可枚举的,比如List<T>。像这样:

var vm2 = new List<YourType>(VM.Technology.TechnologyIPs);
foreach(var ip in vm2)
{
    tms.TechnologyIPs.Remove(ip);
}