Linq 收集被修改;枚举操作可能不会执行,即使在创建当前对象的副本时也是如此
我有以下存储库方法:-Linq 收集被修改;枚举操作可能不会执行,即使在创建当前对象的副本时也是如此,linq,entity-framework,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(
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()
尽管我已经创建了虚拟机的副本,并对其执行了foreach操作。但您需要执行浅拷贝,而不是参考拷贝。即使你复制了它,你也只复制了引用,所以你在相同的
HashSet
上枚举,不管怎样,你都要从中删除内容。
您需要做的是在此基础上构造另一个可枚举项,如列表
。像这样:
var vm2 = new List<YourType>(VM.Technology.TechnologyIPs);
foreach(var ip in vm2)
{
tms.TechnologyIPs.Remove(ip);
}
var vm2=新列表(VM.Technology.TechnologyIPs);
foreach(vm2中的var ip)
{
tms.TechnologyIPs.Remove(ip);
}
但在我的例子中,虚拟机不是一个列表,而是一个单独的实体。TMSVirtualMachines?