【问题标题】:EF, AddRange, Collection was modified; enumeration operation may not execute修改了 EF、AddRange、Collection;枚举操作可能无法执行
【发布时间】:2014-02-16 16:14:54
【问题描述】:

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

设置:我有一个包含两个表的数据库:

BookTitles:
- Book_Id
- BookName

BookAuthors:
- Author_Id
- AuthorName
- Book_Id

在 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; }
}

它的工作方式:如果我使用此功能将一个 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();
     }
 }

它不起作用的方式:如果我尝试使用 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();
    }
}

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    不能在不同实体中使用同一个集合,试试:

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

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

    【讨论】:

    • 它只会创建 2 个作者。
    • 炒锅完美。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-09-04
    • 2016-06-06
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2020-02-09
    相关资源
    最近更新 更多