5

エラー 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 でコードをテストしました

4

2 に答える 2

5

ally1作成後すぐにコンテキストに追加すると機能します。

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

問題は、特別なケースでの循環参照に関係しています...

z -> z.NationAllys には ally1 が含まれます -> ally1 は著者 = z を参照します

...そして、これに関連している可能性があります:

EF 4.1 および「コレクションが変更されました。列挙操作が実行されない可能性があります。」例外

本当に説明することはできませんが、コードは問題なく動作するはずなので、EF のバグのように見えます。

于 2012-09-03T16:30:11.947 に答える
-1

問題は、循環参照に関係しています。循環を避けるために、いくつかの参照にゼロを割り当てる必要があります

于 2016-01-18T11:45:32.913 に答える