gpt4 book ai didi

c# - 修改了 Entity Framework 集合;枚举操作可能无法执行

转载 作者:太空狗 更新时间:2023-10-29 23:33:06 28 4
gpt4 key购买 nike

我遇到错误Collection was modified, enumeration operation may not execute的解决办法。当“author”和“z”表示相同的元素时,就会发生这种情况。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;

namespace ConsoleApplication1
{
public class Nation
{
public int ID { get; set; }
public int name { get; set; }
public virtual ICollection<NationAlly> NationAllys { get; set; }
}

public class NationAlly
{
public int ID { get; set; }
public int level { get; set; }
public Nation Natio { get; set; }
}

public class NationsContext : DbContext
{
public DbSet<Nation> Nations { get; set; }
public DbSet<NationAlly> NationAllys { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Nation>()
.HasMany(n => n.NationAllys)
.WithRequired()
.Map(conf => conf.MapKey("OwnerID"))
.WillCascadeOnDelete(false);

modelBuilder.Entity<NationAlly>()
.HasRequired(a => a.Natio)
.WithMany()
.Map(conf => conf.MapKey("UserID"))
.WillCascadeOnDelete(false);
}
}


class Program
{



static void Main(string[] args)
{
using (var context = new NationsContext())
{

// We have three Nations and two Allies
Nation nation1 = new Nation()
{
name = 1
};
Nation nation2 = new Nation()
{
name = 2
};
Nation nation3 = new Nation()
{
name = 3
};



context.Nations.Add(nation1);
context.Nations.Add(nation2);
context.Nations.Add(nation3);

context.SaveChanges();

}



using (var context = new NationsContext())
{
Nation z = (from x in context.Nations
where x.name == 1
select x).FirstOrDefault();


Nation author = (from x in context.Nations
where x.name == 1
select x).ToList().FirstOrDefault();

NationAlly ally1 = new NationAlly()
{
Natio = author
};

// toNation of ally1 refers to Nation2
// ally1.User = author;


if (z.NationAllys != null)
{
z.NationAllys.Add(ally1);
}
else
{
z.NationAllys = new List<NationAlly>();
z.NationAllys.Add(ally1);
}




context.SaveChanges();




}
}


}

}

我在 Entity Framework 4.1 和 5 上测试了代码

最佳答案

如果您在创建 ally1 后立即将其添加到上下文中,它会起作用:

//...
NationAlly ally1 = new NationAlly()
{
Natio = author
};
context.NationAllys.Add(ally1);
//...

问题与您在特殊情况下的循环引用有关...

z -> z.NationAllys 包含 ally1 -> ally1 引用 author = z

...并且可能与此相关:

EF 4.1 and "Collection was modified; enumeration operation may not execute." exception

我真的无法解释它,但对我来说它看起来像是一个 EF 错误,因为您的代码应该可以正常工作。

关于c# - 修改了 Entity Framework 集合;枚举操作可能无法执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12250868/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com