2016-11-24 1 views
0

I가 엔티티 프레임 워크 코어 1.1에서 다음 엔티티 :System.AggregateException가 발생했습니다 - 컬렉션 수정

public class Question { 
    public Int32 Id { get; set; } 
    public Int32 AuthorId { get; set; } 
    public String Content { get; set; } 
    public virtual User Author { get; set; } 
    public virtual ICollection<Answer> Answers { get; set; } 
} 

public class Answer { 
    public Int32 Id { get; set; } 
    public Int32 QuestionId { get; set; } 
    public Int32 AuthorId { get; set; } 
    public String Content { get; set; } 
    public virtual Question Question { get; set; } 
    public virtual User Author { get; set; } 
} 

public class User : IdentityUser<Int32> { 
    public virtual ICollection<Answer> Answers { get; set; } = new List<Answer>(); 
    public virtual ICollection<Question> Questions { get; set; } = new List<Question>(); 
} 

public class Context : IdentityDbContext<User, Role, Int32> { 
    public DbSet<Answer> Answers { get; set; } 
    public DbSet<Question> Questions { get; set; } 

    public Context(DbContextOptions<Context> options) : base(options) { } 

    protected override void OnModelCreating(ModelBuilder builder) { 
    base.OnModelCreating(builder); 

    builder.Entity<Question>(b => 
     b.ToTable("Questions"); 
     b.HasKey(x => x.Id); 
     b.Property(x => x.Content).HasMaxLength(400).IsRequired(true); 
     b.HasOne(x => x.Author).WithMany(x => x.Questions).HasForeignKey(x => x.AuthorId).IsRequired(true).OnDelete(DeleteBehavior.Restrict); 
    }); 

    builder.Entity<Answer>(b => 
     b.ToTable("Answers"); 
     b.HasKey(x => x.Id); 
     b.Property(x => x.Content).HasMaxLength(4000).IsRequired(true); 
     b.HasOne(x => x.Author).WithMany(x => x.Answers).HasForeignKey(x => x.AuthorId).IsRequired(true).OnDelete(DeleteBehavior.Restrict); 
     b.HasOne(x => x.Question).WithMany(x => x.Answers).HasForeignKey(x => x.AuthorId).IsRequired(true).OnDelete(DeleteBehavior.Cascade);   
    }); 
    } 
} 

나는 (내가 하나를 추가하고 다음 코드) 질문 목록을 만들려고 :

List<Question> questions = new List<Question>(); 

    questions.Add(new Question { 
     Approved = DateTime.UtcNow, 
     Author = context.Users.First(), 
     Content = "question", 
     Created = DateTime.UtcNow, 
     IsApproved = true, 
     Level = context.Levels.First(), 
     Updated = DateTime.UtcNow, 
     Answers = new List<Answer> { 
     new Answer { 
      Approved = DateTime.UtcNow, 
      Author = context.Users.Last(), 
      Content = "answer", 
      Created = DateTime.UtcNow, 
      IsApproved = true, 
      Updated = DateTime.UtcNow 
     } 
     } 
    }); 

    context.AddRange(questions); 
    await context.SaveChangesAsync(); 

나는 다음과 같은 오류 얻을 질문에 추가 할 때이를 작업했다

System.AggregateException occurred 
InvalidOperationException: Collection was modified; enumeration operation may not execute. 

을 EntityFramework 1.0.1. 1.1로 마이그레이션 할 때 오류가 발생했습니다.

내가 코드 줄 Author = context.Users.Last(),에 응답하면 올바르게 작동합니다.

이 나는 ​​뭔가를 놓치고 있습니까?

답변

0

일반적으로 저장시 전체 개체를 탐색 속성으로 첨부하는 것은 새 레코드를 삽입 할 수 있기 때문에 좋은 생각이 아닙니다. 내 생각 엔 사용자 목록을 수정 된 상태로 만들 수있는 질문을 만들 때 사용자를 추가하려고합니다.

개체를 만들기 전에 첫 번째 및 마지막 사용자를 먼저 얻은 다음 개체 만들기를 수행하는 것이 가장 좋습니다.

var firstUser = context.Users.First(); 
var lastUser = context.Users.Last(); 

List<Question> questions = new List<Question>(); 

questions.Add(new Question { 
    Approved = DateTime.UtcNow, 
    Author = firstUser, 
    Content = "question", 
    Created = DateTime.UtcNow, 
    IsApproved = true, 
    Level = context.Levels.First(), 
    Updated = DateTime.UtcNow, 
    Answers = new List<Answer> { 
    new Answer { 
     Approved = DateTime.UtcNow, 
     Author = lastUser, 
     Content = "answer", 
     Created = DateTime.UtcNow, 
     IsApproved = true, 
     Updated = DateTime.UtcNow 
    } 
    } 
}); 

context.AddRange(questions); 
await context.SaveChangesAsync();