实体框架集合已修改;枚举操作可能无法执行 [英] Entity framework Collection was modified; enumeration operation may not execute
问题描述
我有一个问题,解决了错误Collection Collection被修改,枚举操作可能无法执行。
当author和z表示相同的元素时,会发生。
I have a problem with the solution of the error Collection was modified, enumeration operation may not execute. It occurs when "author" and "z" suggests the same element.
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();
}
}
}
}
我测试了实体框架4.1和5上的代码
I tested the code on Entity Framework 4.1 and 5
推荐答案
如果您在创建它之后,将 ally1
添加到上下文中:
It works if you add the ally1
to the context immedately after you've created it:
//...
NationAlly ally1 = new NationAlly()
{
Natio = author
};
context.NationAllys.Add(ally1);
//...
这个问题与你所拥有的循环引用有关你的特殊情况...
The problem has to do with the circular reference you have in your special case...
z - > z.NationAllys包含ally1 - > ally1指的是author = z
...可能与此相关:
...and is likely related to this one:
EF 4.1和Collection was modified;枚举操作可能无法执行。例外
我无法真正解释它,但是看起来像是一个EF错误,因为你的代码应该没有问题。
I can't really explain it, but it looks like an EF bug to me as your code should work without problems.
这篇关于实体框架集合已修改;枚举操作可能无法执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!