EF,AddRange,Collection被修改; 枚举操作可能无法执行

Joh*_*ohn 2 c# entity-framework

问题:我正在尝试使用AddRange将对象列表保存到数据库中.

安装程序:我有两个表的数据库:

BookTitles:
- Book_Id
- BookName

BookAuthors:
- Author_Id
- AuthorName
- Book_Id
Run Code Online (Sandbox Code Playgroud)

在BookAuthors表中,"Book_Id"是BookTitles表中的外键.我使用实体框架,数据库优先.EF为我创建了模型,因此BookTitles的模型如下所示:

public partial class BookTitles
{
    public BookTitles()
    { this.BookAuthors = new HashSet<BookAuthors>(); }

    public int Book_Id { get; set; }
    public string BookName { get; set; }

    public virtual ICollection<BookAuthors> BookAuthors { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

它的工作方式:如果我使用此函数将一个Book记录(其中包含BookAuthors列表)添加到数据库,它可以正常工作.下面的函数将向BookTitles表添加一条记录,然后记录到BookAuthors表.这里我使用"添加"方法:

private static void InsertBook()
{
    using (var db = new BooksContext())
    {
        var authors = new List<BookAuthors>()
        {
            new BookAuthors() {AuthorName = "Author 1"},
            new BookAuthors() {AuthorName = "Author 2"}
        };

        var book = new BookTitles {BookName = "Book1", BookAuthors = authors};

        db.BookTitles.Add(book);
        db.SaveChanges();
     }
 }
Run Code Online (Sandbox Code Playgroud)

它不工作的方式:如果我尝试使用AddRange()将数据库列表添加到数据库,它将抛出错误"集合已被修改;枚举操作可能无法执行":

private static void AddRangeOfBooks()
{
    using (var db = new BooksContext())
    {
        var listOfAuthors = new List<BookAuthors>
        {
            new BookAuthors() {AuthorName = "Author1"},
            new BookAuthors() {AuthorName = "Author2"}
        };

        var listOfBooks = new List<BookTitles>
        {
            new BookTitles() {BookName = "Book 1", BookAuthors = listOfAuthors},
            new BookTitles() {BookName = "Book 2", BookAuthors = listOfAuthors}
        };

        db.BookTitles.AddRange(listOfBooks);
        db.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么会抛出错误?为什么它与Add()方法一起使用(添加单个记录)并且不适用于AddRange()(添加一系列记录)?

Pet*_*iss 9

您不能在不同的实体中使用相同的集合,请尝试:

var listOfBooks = new List<BookTitles>
{
    new BookTitles() {BookName = "Book 1", BookAuthors = listOfAuthors},
    new BookTitles() {BookName = "Book 2", BookAuthors = listOfAuthors.ToList()}
};
Run Code Online (Sandbox Code Playgroud)

重要的是ToList().我遇到了一些类似的问题,我认为这必须解决问题因为EF使用hashset来跟踪每个对象以及集合.如果将相同的集合放入不同的实体,框架将不知道它属于何处.