2012-09-03 14 views
5

Tengo un problema con la solución del error La recopilación se modificó, la operación de enumeración puede no ejecutarse. Ocurre cuando "autor" y "z" sugieren el mismo elemento.Se modificó la colección Entity framework; la operación de enumeración no se puede ejecutar

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(); 




     } 
    } 


} 

} 

He probado el código en Entity Framework 4.1 y 5

Respuesta

4

Funciona si se agrega el ally1 al contexto immedately después de que haya creado:

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

El problema tiene que hacer con la referencia circular que tiene en su caso especial ...

z -> z.NationAllys contiene ally1 -> ally1 se refiere al autor = Z

... y está probablemente relacionado con éste:

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

Realmente no puedo explicarlo, pero parece que un error de EF para mí como su código debería funcionar sin problemas.

+0

¡Sí! Gracias. Mi problema también era referirme a los tipos, donde intentaba indicarle a EF que había una referencia en ambos sentidos explícitamente. Después de eliminar la referencia padre-hijo, ¡funcionó bien! –

-1

El problema tiene que ver con la referencia circular que tiene. Debe asignar cero a alguna referencia para evitar el ciclo

Cuestiones relacionadas